2009-10-12 206 views
7

我试图实现对WCF客户端重新连接逻辑。我知道你必须在当前频道进入故障状态后创建一个新频道。我这样做的一个通道故障事件处理程序:WCF回调通道故障


internal class ServiceClient : DuplexClientBase, IServiceClient 
{ 
    public ServiceClient(ICallback callback, EndpointAddress serviceAddress) 
    : base(callback, MyUtility.GetServiceBinding("NetTcpBinding"), serviceAddress) 
    { 
    // Open the connection. 
    Open(); 
    } 

    public void Register(string clientName) 
    { 
    // register to service 
    } 

    public void DoSomething() 
    { 
    // some code 
    } 
} 

public class ClientApp 
{ 
    private IServiceClient mServiceClient; 

    private ICallback mCallback; 

    public ClientApp() 
    { 
    mServiceClient = new ServiceClient(mCallback, new EndpointAddress("someAddress")); 

    mServiceClient.Register(); 

    // register faulted event for the service client 
    ((ICommunicationObject)mServiceClient).Faulted += new EventHandler(ServiceClient_Faulted); 
    } 

    void ServiceClient_Faulted(object sender, EventArgs e) 
    { 
    // Create new Service Client. 
    mServiceClient = new ServiceClient(mCallback, new EndpointAddress("someAddress")); 

    // Register the EI at Cell Controller 
    mServiceClient.Register(); 
    } 

    public void DoSomething() 
    { 
    mServiceClient.DoSomething(); 
    } 
} 

但在我的单元测试我仍然获得了“通信对象,System.ServiceModel.Channels.ServiceChannel,不能用于通信,因为它是在断陷状态“异常。

是否有可能回调通道仍然故障,如果是我怎么能代替回调通道?

+0

你能指定你的单元测试在触发异常时做什么吗? – 2009-10-13 08:57:45

+0

在我的单元测试中,我创建了一个服务主机和一个客户端实例。我在服务上注册客户端,然后通过将参考设置为null来停止服务。之后,我等了20秒(我使用了一个可靠的会话,InactivityTimeout为10秒,所以我确定连接在20秒后失效),然后在客户端调用DoSomething()方法。现在我重新创建服务并期望客户端重新连接。在那一刻,我得到了例外。 – phatoni 2009-10-14 16:30:13

回答

5

到目前为止,我已经经历了一个WCF连接需要对故障进行重建 - 似乎没有成为一个办法,否则恢复。至于何时发生故障,该方法似乎没有问题,但通常会触发并清理WCF连接(建立一个新的等),因为当前请求正在经历 - 导致此失败 - 特别是在超时时发生。

一些建议: - 如果它是超时相关的,请记录上次进行的调用和包含超时值的常量。如果WCF连接由于不活动而被删除,请将其删除并重新创建,然后在之前通过网络发送请求。 - 另一件事,看起来你没有重新添加故障处理程序,这意味着第一个故障将被处理,但第二个故障将会在没有处理程序的情况下倒下,因为没有新的故障处理程序。

希望这会有帮助

0

您是否尝试过在有故障的事件处理程序调用mServiceClient.Abort重置通信信道?

编辑:

我看你不重新初始化mCallback对象救援码。您可能需要将其分配给新实例。

+0

感谢您的帮助。是的,我之前尝试过,但它没有那么多帮助,因为我得到了“通信对象System.ServiceModel.Channels.ServiceChannel不能用于通信,因为它处于异常状态”异常而不是上述提到的例外。 – phatoni 2009-10-14 16:22:13