【问题标题】:WCF Callback failing due to object not being initialized (Duplex)由于对象未初始化(双工),WCF 回调失败
【发布时间】:2013-08-23 15:59:46
【问题描述】:

所以我有一个引发事件的对象和一个托管在 Windows 服务中的 WCF 服务。

引发的事件当前位于 Windows 服务中的一个类中,WCF 服务订阅这些事件,当事件触发时,它们是对客户端的回调,让客户端知道在另一部分发生的事情视窗服务。

问题在于,回调有时有效,有时无效。我已经检查是否有任何客户可以回电,如果没有,我不打扰。我不确定实现这一点的最佳方法是因为有时:

call = OperationContext.Current.GetCallbackChannel<IRiskEoDWCFEvents>();

由于进入 WCF 服务的事件来自 Windows 服务的另一部分(A 类)而不是来自 OperationContext,因此在它异常或设置为 null 的其他时间获取回调。

简而言之 如何设置我的 WCF 服务以在我的 Windows 服务的另一部分发生事件时向客户端发出警报?

(更多代码)

在发布事件之前,我会进行这样的检查(只有在我们有客户时才会发布):

        private void Publish(EoDEvent eodListEvent, EoDItem item)
        {
            if ( _EoDEventSubscribers == null || _EoDEventSubscribers.Count == 0)
            {
               //Cannot publish because we have no one listening
               return;
            }
       .....

然后我把它全部发布出来:

            Thread myThread = new Thread(myObject =>
            {

                lock (_SubscriberLock)
                {
                    foreach (IRiskEoDWCFEvents callback in _EoDEventSubscribers)
                    {
                        if (callback.GetHashCode() != myObject.GetHashCode())
                        {
                            Logging.WriteLine("Sending event to {0}", callback.GetHashCode());
                            try
                            {

                               if (eodListEvent == EoDEvent.EoDComponentStarted)
                                    callback.EoDComponentStarted(item);
                               else if (eodListEvent == EoDEvent.EoDComponentCompleted)
                                    callback.EoDComponentCompleted(item);
                               .....
                            }
                            catch (Exception ex)
                            {
                                FaultException faultex = ex as FaultException;
                                if (faultex == null)
                                {
                                    Logging.WriteLine("Callback failed, removing {0}",                   callback.GetHashCode());
                                    toRemove.Add(callback);
                                }
                            }
                        }
                    }
                    if (toRemove.Count > 0)
                    {
                        foreach (IRiskEoDWCFEvents cb in toRemove)
                        {
                            _EoDEventSubscribers.Remove(cb);
                        }
                    }
                }

            });
            myThread.Priority = ThreadPriority.Highest;
            myThread.Start(call);

【问题讨论】:

    标签: c# .net wcf callback duplex


    【解决方案1】:

    所以我发现下面的工作只是为了在我的 foreach 循环中获取回调并触发对客户端的更新。

    首先我设置呼叫最新的订阅者

           public void Subscribe()
           {
             IRiskEoDWCFEvents callback = OperationContext.Current.GetCallbackChannel<IRiskEoDWCFEvents>();
    
             call = callback;
    
             lock (_SubscriberLock)
             {
                 if (!_EoDEventSubscribers.Contains(callback))
                 {
                     Logging.WriteLine("Adding callback {0}", callback.GetHashCode());
                     _EoDEventSubscribers.Add(callback);
                }
            }
        }
    

    然后在发布方法上,我正在做一个快速检查,试图将其设置为当前的回调通道,但如果失败,只需抓住一个我知道在那里的:

            if ( _EoDEventSubscribers == null || _EoDEventSubscribers.Count == 0)
            {
                //Cannot publish because we have no one listening
                return;
            }
    
            if (call == null)
            {
                try
                {
                    call = OperationContext.Current.GetCallbackChannel<IRiskEoDWCFEvents>();
                }
                catch
                {
                    call = _EoDEventSubscribers[0];
                }
            }
    

    虽然这是可行的,但我不确定这是否是最好的方法。

    【讨论】:

      猜你喜欢
      • 2011-03-24
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      • 1970-01-01
      • 2016-09-28
      相关资源
      最近更新 更多