寻求WCF双工"TwoWay"订阅+回调示例

Jas*_*ban 18 wcf duplex callback timeoutexception

重新获得赏金,因为我真的需要知道如何让它发挥作用,或者为什么不会这样做的明确答案.

我在这里添加了对问题的另一种解释.

有一段时间让双向(IsOneWay = false)WCF客户端服务器在.Net 3/3.5中工作.

在客户端成功注册该服务后,该服务的定期Announcement()将回调注册的客户端.现在,客户端或服务器挂起,直到服务器的SendTimeout(调整为2秒)过去.然后服务器端有一个超时异常,如下所示.只有这样,客户端用户代码才会立即接收METHOD CALL并尝试返回一个值.到那时,客户端的套接字被中止,WCF的内容失败.

在我看来,客户端上的某些东西正在挂起它的本地WCF队列,从处理到套接字超时,但不是很早就取消了本地方法调用.但是,如果相信下面的例外,服务器正在尝试将操作发送到http://schemas.microsoft.com/2005/12/ServiceModel/Addressing/Anonymous(不合适!)并且超时.也许该URI只是远程连接客户端的"名称",因为WCF知道为了出现错误消息而引用它,它似乎意味着它无法加载URI.我无法判断服务器是先失败还是客户端先失败.

我已经尝试添加WCF跟踪,但我没有获得更多信息.

类似的示例代码在这里,但它必须过多才能消化.我已经尝试过该代码的变种.

TimeoutException 'This request operation sent to http://schemas.microsoft.com/2005/12/ServiceModel/Addressing/Anonymous did not receive a reply within the configured timeout (00:00:00).  The time allotted to this operation may have been a portion of a longer timeout.  This may be because the service is still processing the operation or because the service was unable to send a reply message.  Please consider increasing the operation timeout (by casting the channel/proxy to IContextChannel and setting the OperationTimeout property) and ensure that the service is able to connect to the client.'

Server stack trace: 
   at System.ServiceModel.Dispatcher.DuplexChannelBinder.SyncDuplexRequest.WaitForReply(TimeSpan timeout)
   at System.ServiceModel.Dispatcher.DuplexChannelBinder.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Run Code Online (Sandbox Code Playgroud)

Ian*_*ose 27

首先,如果您还没有编程WCF服务,请获取一份.

如果客户端是WinForm或WPF,则需要使用[CallbackBehavior(UseSynchronizationContext = false)],否则客户端将不会处理传入消息,直到UI线程进入消息循环.

首先,WCF中的"双工"通道不是真正的双工! 来自的消息

  • 客户端到服务器
  • 可以阻止服务器等待来自客户端的消息
  • (或反过来)

因为消息仅在单个WCF通道上按顺序分派.双工WCF通道不会为您提供两个传入的消息队列.从"TwoWay"调用返回的结果与作为WCF堆栈的此级别的"调用"相同. 一旦你了解了这一点,很多问题就会变得更清楚了解.

如果客户端是WinForm或WPF,则可能需要使用[CallbackBehavior(UseSynchronizationContext = false)],否则客户端将不会处理传入消息,直到UI线程进入消息循环.

我发现一些规则可以帮助避免死锁.(看看我的WCF问题,看看我的痛苦!)

服务器必须永远不会呼叫同一连接上的客户端,因为来自同一客户端的呼叫正在进行中.

和/或

在处理回叫时,客户端必须永远不会在与用于"回调"的连接相同的连接上回叫服务器.

下次我想我将只使用两个契约(以及TCP连接)一个用于回调,另一个用于所有客户端 - >服务器请求.或者使用我自己的投票系统,因为这给了我很多痛苦.

对不起,我今天没时间写一个例子.无论如何,大多数示例都适用于该示例尝试执行的操作,但由于某些原因导致您的应用程序出现故障.

我知道WCF示例的最佳网站是Juval Lowy的网站.

您可能也会发现我在Stack Overflow上询问有关WCF问题是有用的,因为我遇到了与您相同的问题.

还花了一两天阅读Stack Overflow上的所有WCF问题和答案,可以很好地了解要避免的问题.