The problem arises after I restart the remoting server.
Client, server register their channels successfully
Client successfully calls method on remote object
I manually restart the server
Client calls method again, but this time the method call never returns
If the client is using keep-alive connections I would expect the previous connection to fail, and the client to initiate another connection to the server's HTTP channel. I tried configuring the client channel with a timeout, and also setting the object's lifetime to a few seconds, but nothing worked. Any ideas?
I'd suggest moving over to WCF, this is a much better supported technology for this scenario. WCF's behavior in this case would be to detect the broken connection on each RPC call and give you an exception in return. It doesn't have any built-in retry logic, you'll have to wrap your client code in exception handling that submits the retry. At least it won't just hang and not return so you don't have to write your own timeout/cancel handling code.
Note that the WCF connection period can be long (~30 seconds on an IPv6 enabled client for connect, 60 seconds timeout for an already established connection which is broken due to an abnormally disconnected server) so if your latency requirements for detecting a broken connection are tighter than this, you still need to write your own timeout/cancel logic. For example, if you're doing a network RPC in response to user action to update the UI, you may want to have a shorter timeout window than 30-60 seconds. Be careful about making it too short, as IPv6 connections can take a good 20-30 seconds to successfully negotiate a connection at times. This is due to all the IPv6/IPv4 compatibility/tunelling negotiation that goes on behind the scenes of a basic TCP/IP connection.