Есть другой способ. Вы можете создать клиентский прокси для каждого запроса, вместо того чтобы использовать один экземпляр для более чем одного запроса. Таким образом, если канал переходит в неисправное состояние, он все равно удаляется.
Это немного сложно, потому что вы не должны располагать каналом, кроме того, что он может быть IDisposable.
Это не сработает:
using(var channel = channelFactory.CreateChannel())
{
return channel.ServiceMethod(parameter);
}
Вместо этого вы должны:
public static class Service<T>
{
public static ChannelFactory<T> _channelFactory = new ChannelFactory<T>("");
public static TResult Use<TResult>(Func<T, TResult> func)
{
TResult output;
var channel = (IClientChannel)_channelFactory.CreateChannel();
bool success = false;
try
{
output = func((T)proxy);
channel.Close();
success = true;
}
finally
{
if (!success)
{
proxy.Abort();
}
}
return output;
}
}
return Service<IService>.Use(channel =>
{
return channel.ServiceMethod(parameter);
});