你是否必须在WCF basicHttpBinding服务的客户端代理上调用Close()/Abort()

本文关键字:代理 调用 Close Abort 客户端 是否 WCF 服务 basicHttpBinding | 更新日期: 2023-09-27 18:02:05

关于这个问题我似乎能找到一个明确的答案。我知道客户端代理的using(){}问题。但是我们有一个客户端,它正在吞食我们的服务返回的所有异常,并且似乎在异常发生后,客户端无法再与服务通信(我们在服务跟踪中没有得到任何结果)。客户端是一个web应用程序。NET 3.5)。有人经历过这种行为吗?

下面是客户端代码:
public static bool ValidateDigitalSignatureCredentials(string barNumber, string PIN)
{
    UserInfo userTicket = JTAC.INcite.Framework.Security.Authentication.CurrentUser;
    DigitalSigning.DigitalSignatureClient client = null;
    bool validSigning = false;
    try
    {
        client = new DigitalSigning.DigitalSignatureClient();
        client.ClientCredentials.UserName.UserName = "foo";
        client.ClientCredentials.UserName.Password = "bar";
        validSigning = client.VerifyCredentials(barNumber, PIN);
        if (client.State != CommunicationState.Faulted)
        {
            client.Close(); // (timeout);
        }
        else
        {
            client.Abort();
        }
    }
    catch (CommunicationException)
    {
        client.Abort();
    }
    catch (TimeoutException)
    {
        client.Abort();
    }
    return validSigning;
}

你是否必须在WCF basicHttpBinding服务的客户端代理上调用Close()/Abort()

一些观察/建议:

  1. 将includeExceptionDetailInFaults在服务的配置文件中设置为true——这将把异常转换为FaultException(应该只用于调试)。它在配置文件的行为部分,在serviceDebug元素中。

  2. 你可以通过在try块中删除对CommunicationState的检查来节省一些代码,并简单地调用:

    client.Close ();

    如果抛出错误,catch块将捕获它并中止通道。

  3. 如果您尝试步骤1,您可能需要添加另一个catch块:

    抓住(FaultException){}

  4. 另外,我将添加(为了调试目的)另一个catch块来处理Exception:

    抓住(异常){}

很可能服务抛出了一个未处理的异常,这将导致通信通道故障。希望我上面列出的一些内容能帮助你确定异常是什么,这样你就可以解决它了。