【问题标题】:WCF callback channel abort exceptionWCF 回调通道中止异常
【发布时间】:2013-05-10 14:44:43
【问题描述】:

我用 WCF 实现了发布者-订阅者机制。

这就是我订阅回调的方式:

public delegate void AsyncResponseEventHandler(AsyncResponse asyncResponse); 
public static event AsyncResponseEventHandler AsyncResponseEvent;       
public static IMyEvents Subscriber;        
public  void SubscribeEvent()        
{            
Subscriber = OperationContext.Current.GetCallbackChannel<IMyEvents>();            
AsyncResponseEvent += new AsyncResponseEventHandler (Subscriber.AsyncResponseCallBack);        
}         
public static void RaiseAsyncResponse(AsyncResponse asyncResponse)    
{         
   try 
           {                
        AsyncResponseEvent.Invoke(asyncResponse);
           }            
catch (Exception ex)  {throw;}    
}     

这也是 MySubscriber 类代码:

     public class MySubscriber : IMyEvents
    {


 public void AsyncResponseCallBack(AsyncResponse asyncResponse)
        {

            AsyncResponseEventArgs e = new AsyncResponseEventArgs()
            {
                Response = asyncResponse
            };
            OnAsyncResponseReceived(this, e);

        }
    }

我使用 RaiseAsyncResponse 方法向客户端发起回调,

当服务主机是windows服务并且我启动服务并开始调试时,第一次一切正常,但是当我停止客户端应用程序并重新启动调试而不重新启动windows服务时,我遇到了异常:通信对象System.ServiceModel.Channels.ServiceChannel,不能用于通信,因为它已经被Abort ...

为什么回调通道被中止? 请帮帮我... :(

【问题讨论】:

    标签: c# wcf windows-services


    【解决方案1】:

    因为“但是当我停止客户端应用程序时”就是答案。停止客户端应用程序后,System.ServiceModel 将立即释放对通道的保留。如果您终止服务或客户端,则无法将数据从服务发送到客户端,反之亦然。

    【讨论】:

    • 感谢您的回答...所以我的问题是基于 nettcpbinding 如何用于回调,如何实现双工消息模式,如果我重新启动客户端就不必重新启动服务?
    • 首先,您可以随时获取客户端调用函数的回调通道。否则,您将需要存储回调通道,可能在字典中。然后,当客户端启动时,它应该进行服务调用以“注册”它的回调通道。然后服务可以随时使用它。在该服务调用中,订阅 ChannelClosed 事件,并在客户端断开连接时移除通道。当你重启客户端时,它应该再次调用服务来注册它的回调。
    猜你喜欢
    • 1970-01-01
    • 2011-07-09
    • 2011-01-12
    • 2010-12-29
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 2010-12-06
    相关资源
    最近更新 更多