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

时间:2011-07-12 15:31:45

标签: c# wcf basichttpbinding

我似乎在这个问题上找到了明确的答案。我知道客户端代理的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;
}

1 个答案:

答案 0 :(得分:0)

一些观察/建议:

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

  2. 您可以通过删除try块中的CommunicationState检查来保存一些代码,然后只需调用:

    client.Close();

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

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

    catch(FaultException) { }

  4. 另外,我会添加(用于调试目的)另一个catch块来处理Exception:

    catch(例外) { }

  5. 很可能该服务正在抛出未处理的异常,这会使通信通道出错。希望我上面提到的一些内容将帮助您确定异常是什么,以便您可以解决它。