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

C# 是否必须在WCF basicHttpBinding服务的客户端代理上调用Close()/Abort()?,c#,wcf,basichttpbinding,C#,Wcf,Basichttpbinding,在这个问题上,我似乎能找到一个明确的答案。我知道客户端代理使用(){}的问题。但是我们有一个客户端,它正在吃掉我们的服务返回的所有异常,并且似乎在异常发生后,客户端无法再与服务通信(我们在服务跟踪中没有得到任何结果)。客户端是一个web应用程序(.NET 3.5)。有人经历过这种行为吗 以下是客户端代码: public static bool ValidateDigitalSignatureCredentials(string barNumber, string PIN) { User

在这个问题上,我似乎能找到一个明确的答案。我知道客户端代理使用(){}的问题。但是我们有一个客户端,它正在吃掉我们的服务返回的所有异常,并且似乎在异常发生后,客户端无法再与服务通信(我们在服务跟踪中没有得到任何结果)。客户端是一个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;
}

一些观察/建议:

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

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

    client.Close()

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

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

    捕获(错误异常) { }

  • 此外,为了调试目的,我还添加了另一个catch块来处理异常:

    捕获(例外) { }


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

    一些观察/建议:

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

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

    client.Close()

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

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

    捕获(错误异常) { }

  • 此外,为了调试目的,我还添加了另一个catch块来处理异常:

    捕获(例外) { }


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

    检查客户端状态。它是否处于故障状态?如果是,请重新打开它。尝试将您的客户端键入ICommunicationObject,看看它是否仍然超时?此外,我认为如果它处于故障状态,您可能希望调用Abort而不是close。不过不确定。最好在VisualStudio调试器中启用“断开所有异常”,然后您将确切地看到引发了什么异常。例如,在这里,我想知道是否有其他类型的异常引起了
    client
    无效-可能是凭据问题?我可能遵循了错误的编码风格,但我总是使用
    var client=new client();尝试{var result=client.call();}捕获(异常){client.Abort();}最后{if(client.State==faulted)client.Abort();else client.Close();}
    。检查此检查客户端状态。它是否处于故障状态?如果是,请重新打开它。尝试将您的客户端键入ICommunicationObject,看看它是否仍然超时?此外,我认为如果它处于故障状态,您可能希望调用Abort而不是close。不过不确定。最好在VisualStudio调试器中启用“断开所有异常”,然后您将确切地看到引发了什么异常。例如,在这里,我想知道是否有其他类型的异常引起了
    client
    无效-可能是凭据问题?我可能遵循了错误的编码风格,但我总是使用
    var client=new client();尝试{var result=client.call();}捕获(异常){client.Abort();}最后{if(client.State==faulted)client.Abort();else client.Close();}
    。检查此项