1

我有一个使用 nettcpbinding 的异步 WCF 服务。我向它发送了一堆请求,并通过在我的回调中调用 EndDoWork() 来获得结果。如果 EndDonWork 抛出一次异常,之后的所有调用都会抛出异常:通信对象 System.ServiceModel.Channels.ServiceChannel 不能用于通信,因为它处于 Faulted 状态。

由于第一个异常,我认为这是关闭连接的东西。我的问题是:1.是什么决定了这种行为?如果我使用 basicHttpBinding,则稍后调用 EndDoWork 效果很好。它与keepAlive支持有关吗?2. 配置项有没有什么属性可以设置让服务自动重连?

4

3 回答 3

2

通道的故障状态表示不能再依赖它。您没有提到引发异常的原因是什么(连接、服务器停止等),但就 WCF 而言,端点无效并因此出现故障。

您应该重新创建通道并再次连接到服务以继续您的任何操作。如果您使用可靠连接之类的功能,则可能会为您完成一些工作,但如果通道最终出现故障,则适用相同的规则。

您还必须实现自己的消息队列来重新请求通道故障时挂起的消息。您不能依赖通道来保留和重新发送消息。

于 2011-06-17T05:46:25.100 回答
1

如果我没记错的话,如果你在操作合约中声明Fault,就可以避免通道故障。

例如:

[ServiceContract]
public interface IService
{
    [OperationContract]
    [FaultContract(typeof(MyDefinedFault))]
    void Operation();
}

由于您已经在 Operation 合同中声明了 MyDefinedFault,如果您从服务中抛出它,则通道不会出现故障(当然,除非您使用 System.ServiceModel.Description.ServiceDebugBehavior.IncludeExceptionDetailInFaults=true 这可能会导致通道出现故障)。

于 2009-04-18T18:26:29.683 回答
1

MyDefinedFault 类在哪里。如何定义这个类。

于 2009-06-10T15:11:32.710 回答