1

我在 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 包含的每个方法,如果某个方法不再存在,则默默地将其从列表中删除并继续调用后续方法。

我怎样才能做到这一点?

4

0 回答 0