所以我有一个对象引发一个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);