【问题标题】:Do you have to call Close()/Abort() on client proxy for WCF basicHttpBinding service?您是否必须在 WCF basicHttpBinding 服务的客户端代理上调用 Close()/Abort()?
【发布时间】:2011-10-03 18:06:25
【问题描述】:

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

【问题讨论】:

  • 检查客户端状态。是否处于故障状态?如果是则重新打开它。
  • 尝试将您的客户端类型转换为 ICommunicationObject 并查看它是否仍然超时?另外我认为如果它处于故障状态,您可能想要调用 Abort 而不是关闭。不过不确定。
  • 最好在 Visual Studio 调试器中打开“中断所有异常” - 然后您将准确地看到引发了什么异常。例如,在这里,我想知道是否引发了其他类型的异常导致 client 无效 - 可能是凭据问题?
  • 我的编码风格可能不好,但我总是使用var client = new client(); try { var result = client.call(); } catch (Exception) { client.Abort(); } finally { if (client.State == faulted) client.Abort(); else client.Close(); }

标签: c# wcf basichttpbinding


【解决方案1】:

一些观察/建议:

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

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

    client.Close();

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

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

    catch (FaultException) { }

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

    捕捉(例外) { }

服务很可能会引发未处理的异常,这将导致通信通道出现故障。希望我上面的一些内容可以帮助您确定异常是什么,以便您解决它。

【讨论】:

    猜你喜欢
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多