2013-08-23 27 views
0

所以我有一个对象引发一个Windows服务中托管的事件和一个WCF服务。由于对象没有被初始化而导致WCF回调失败(双工)

引发的事件目前在Windows服务中的一个类中,WCF服务订阅这些事件,当事件触发时,它们意味着回调给客户端,让客户端知道发生在另一部分Windows服务。

问题是,有时回调工作,有时他们没有。我有检查,看看是否有客户回电话,如果不是我不打扰。我不知道要实现这一点的最好办法就是因为在次:

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

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

简而言之 如何设置我的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); 

回答

0

所以我发现以下工作只是为了获得一个回调,并火了更新,客户在我的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]; 
      } 
     } 

虽然这是工作,我不知道这是要做到这一点的最好办法。

相关问题