I just followed this tutorial and played a little bit with the code. I'm almost sure I read somewhere that there is a timeout for the channel, so it might get automatically closed eventually. So I tried simply opening a new channel in my client for each method I wanted to invoke, and eventually (after lots of calls) I got errors.
Seems like there is a limit on how many channels I can have open at the same time. But since the channel is an instance of a custom object, I don't see how can I close it or kill it or whatever I need to do with it to get rid of it so I can create other channels.
Then I noticed on the CreateChannel
documentation that my TChannel
should implement IChannel
(which the tutorial I linked above doesn't do). So, is this how I would close my channel? If so, how would I close it or what should I do on my implementation of the Close
method? And what should I do on the implementation of every other method if I do have to implement the interface?
Or should I just use a single channel for as long as it lasts? Anyway, how am I supposed to know whether is faulted or open or closed if all I have is an instance of my own class?
As you can see I'm pretty lost on the subject so I hope you can point me in the right direction.
ChannelFactory<TChannel>.CreateChannel
creates and return a channel of your specified service type. The returned object already implements IChannel
. You (normally?) don't need to implement your own Close
method, nor any other methods of IChannel
.
Normally you don't create a new channel for every call, you just re-use it. (Only in some specific cases it may be better to create a new channel for every call).
You can close the channel by casting it to IClientChannel
. Use this pattern:
try
{
((IClientChannel)channel).Close();
}
catch (Exception ex)
{
((IClientChannel)channel).Abort();
}
You can use ((IClientChannel)channel).State
to get the state of the channel (i.e. CreatedOpened
, Faulted
, Closed
).