在出现故障后重新使用WCF中的客户端类

And*_*ndy 9 wcf

我将WCF用于客户端服务器系统.当我在服务器上向IService添加服务引用时,会生成代理类ServiceClient.我的代码如下所示:

ServiceClient client = new ServiceClient();
try
{
    client.Operation1();
}
catch(Exception ex)
{
    // Handle Exception
}
try
{
    client.Operation2();
}
catch(Exception ex)
{
    // Handle Exception
}
Run Code Online (Sandbox Code Playgroud)

问题是如果第一次调用中存在通信异常,则客户端的状态将更改为Faulted,并且我不知道如何重新打开它以进行第二次调用.有没有办法重新打开它?或者我应该创建一个新的并替换实例(它似乎不是一种优雅的方式)?

Mik*_*e_G 16

一旦ICommunicationObject(您的WCF客户端对象)处于故障状态,"重新打开"它的唯一方法是创建一个新的.

ServiceClient client = new ServiceClient();
try
{
    client.Operation1();
}
catch(Exception ex)
{
    if (client.State == CommunicationState.Faulted)
    {
            client.Abort();
            client = new ServiceClient();
    }
}
try
{
    client.Operation2();
}
catch(Exception ex)
{
   // Handle Exception
}
Run Code Online (Sandbox Code Playgroud)


Sco*_*son 5

如果第一次调用中存在导致故障状态的通信异常,则必须基本上"重新创建"WCF客户端代理.在你的例子中,我可能会做类似的事情:

if (client.State == CommunicationState.Faulted)
    client = new ServiceClient();
Run Code Online (Sandbox Code Playgroud)

如果连接出现故障,这将允许您"重新打开"连接.这可能看起来有点矫枉过正,但如果你在客户端获得通信异常,可能还有其他事情发生(即:服务器死了?服务器无响应?)

祝好运


Meh*_*ras 0

这很可能是由服务器端未处理的异常引起的。默认情况下,WCF 运行时会终止您的服务实例,并将通道置于故障状态,以防出现未处理的异常,并且您无法再通过该通道进行通信。因此,您需要与该服务建立一个新会话。您应该在服务器端捕获异常并通过引发FaultException 或定义FaultContract 来发送soap 错误。您还可以使用 returnUnknownExceptionsAsFaults 服务行为。