Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Faulted WCF duplex callback after inactivity - keep alive long-running push notifications

Tags:

c#

.net

tcp

wcf

duplex

In short

How to prevent a duplex callback channel to be closed after an idle period?

In detail

I have a mostly working duplex WCF setup over NetTcpBinding i.e. the client can talk to the server and the server can call back to the client.

Furthermore, I have a reliable session such that the client does not lose the connection to the server after the default period of inactivity, achieved with the following configuration on both client and server:

var binding = new NetTcpBinding(SecurityMode.None);
// Need to prevent channel being closed after inactivity
// i.e. need to prevent the exception: This channel can no longer be used to send messages as the output session was auto-closed due to a server-initiated shutdown. Either disable auto-close by setting the DispatchRuntime.AutomaticInputSessionShutdown to false, or consider modifying the shutdown protocol with the remote server.
binding.ReceiveTimeout = TimeSpan.MaxValue;
binding.ReliableSession.Enabled = true;
binding.ReliableSession.InactivityTimeout = TimeSpan.MaxValue;

However, after a period of inactivity of less than half an hour (haven't measured the minimum time exactly), the server is unable to use the callback again - the server just blocks for a minute or so and I do not see any exceptions, while nothing happens on the client side (no evidence of callback).

Leads and root causes?

Note that I can use the callback fine twice in a row consecutively, as long as I do not wait long in between the callback calls.

  • Are the callbacks configured somewhere else? Do callbacks have their own timeouts etc?
  • Might it be a blocking/threading issue - need to either set UseSynchronizationContext=false on your client, or avoid blocking while waiting for the message to be received
  • Should DispatchRuntime.AutomaticInputSessionShutdown be set to false, and if so, how? I'm not really sure how it relates to reliable sessions and I do not know where to access this property
  • Anything else?
like image 626
Cel Avatar asked Nov 10 '22 15:11

Cel


1 Answers

I achieved this by extending the BaseClient class with an automatic keep alive message to be invoked on the target interface when no other calls are made.

like image 62
Antonio Petricca Avatar answered Nov 14 '22 22:11

Antonio Petricca