今天我有一个WCF问题,尽管它也可能与.NET中的其他网络模型有关。WCF:DuplexSessionChannel,异步操作和异常
我有一个公开发送(消息)OperationContract,这是OneWay = true的WCF服务。现在这个服务有一个回调通道来将消息返回给客户端。
无论如何,我想(成功)从我的客户端异步调用此发送方法。在DuplexSessionChannel上,我调用BeginSend(Message,OnSendComplete,null),并且我有一个在DuplexSessionChannel上调用EndSend(asyncResult)的OnSendComplete(IAsyncResult)方法。
该服务有一个CallbackContract并使用相同的BeginSend()/ EndSend()模式发送回客户端,这是在我用OperationContext.Current.GetCallbackChannel获得的callBack通道上调用的。
从服务回调通道接收消息时,其DuplexSessionChannel上的客户端调用BeginReceive()/ EndReceive()。
即使事情正常,我不明白END <Operation>
()方法实际上做了什么,这是我需要向我解释的。
我问,因为我在Service中调用EndSend()时偶尔发生异常(发送回客户端)抱怨集合已被修改(我知道这个异常意味着什么,但不知道它为什么是发生或确切地...)。我正在使用PollingDuplexHttpBinding和Silverlight客户端。
我不是WCF的专家,但不要阻挡细节,我需要知识。到目前为止,我在职业生涯中的其他异步操作之前已经看到了这些开始/结束模式,但从来没有真正理解发生了什么。
在此先感谢。
在WCF中,IDuplexSessionChannel.BeginSend和EndSend具有以下签名: IAsyncResult BeginSend(Message,AsyncCallback,object) void EndSend(IAsyncResult); 我从传递给BeginSend的AsyncCallback委托调用的回调方法内部调用EndSend。鉴于EndSend()返回无效,我仍然不明白它是什么。我看到它的“结果”来自BeginSends AsyncCallback。我也不明白为什么BeginSend返回IAsyncResult,当它也由BeginSend AsyncCallback异步返回时。 – MrLane 2009-09-09 01:30:07
阅读Brians后发布几个月后,我发布了这个问题,这种模式更加清晰。 Juval Lowery的编程WCF书也很好地解释了这一点。我仍然不知道异常的原因,但它已被淘汰,因为我不再调用EndSend(),因为我意识到无论如何都没有返回任何结果。我不知道这是否是好的做法(也许我可能会错过异常细节),但是这本书似乎暗示它可以被省略,并且因为删除东西已经好很多。 – MrLane 2010-02-02 04:28:50