我在 wcf 中有一个回调服务,如下所示:
[ServiceContract(CallbackContract = typeof(IMyCallbacks), Namespace = "MyNamespace")]
public interface IMyService
{
[OperationContract]
bool subscribe();
[OperationContract]
bool unsubscribe();
}
public interface IMyCallbacks
{
[OperationContract(IsOneWay=true)]
void onNewCallback(int iValue);
}
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single, ConcurrencyMode=ConcurrencyMode.Multiple)]
public class MyService : IMyService
{
Action<int> DelegateOnNewCallback { get; set; }
public bool subscribe()
{
try
{
var wClient = OperationContext.Current.GetCallbackChannel<IMyCallbacks>();
DelegateOnNewCallback += wClient.onNewCallback;
}
catch (Exception iEx)
{
Console.Writeline(iEx.Message);
return false;
}
return true;
}
public bool unsubscribe()
{
try
{
var wClient = OperationContext.Current.GetCallbackChannel<IMyCallbacks>();
DelegateOnNewCallback -= wClient.onNewCallback;
}
catch (Exception iEx)
{
Console.Writeline(iEx.Message);
return false;
}
return true;
}
// This function is called really often
public void CallingFunction(int iValue)
{
try
{
DelegateOnNewCallback(iValue);
}
catch (Exception ex)
{
Console.Writeline(ex.Message);
}
}
}
在客户端,加载后,我订阅回调并打印我收到的值。当客户端关闭时,我调用 unsubscribe 方法。Service 独立于客户端,在此过程中永远不会被销毁。
当客户端进程被销毁并且未调用取消订阅方法时遇到了我的问题。每个后续客户端都不会收到回调,因为 Wcf 通道处于故障状态。每次调用 CallingFunction 时,我都会收到异常:
The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it has been Aborted.
我相信这是因为,由于未正确调用取消订阅,DelegateOnNewCallback 仍然尝试调用现在不存在的已破坏客户端的方法。在那种特殊情况下,我希望通过我的 Try/Catch 接收异常,但是,我不希望服务进入故障状态。
我想要的行为是,当调用 CallingFunction 时,它会尝试调用 DelegateOnNewCallback 包含的每个方法,如果某个方法不再存在,则默默地将其从列表中删除并继续调用后续方法。
我怎样才能做到这一点?