我似乎在这个问题上找到了明确的答案。我知道客户端代理的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;
}
答案 0 :(得分:0)
一些观察/建议:
在服务的配置文件中将includeExceptionDetailInFaults设置为true - 这会将异常转换为FaultException(仅应用于调试)。它位于配置文件的行为部分,位于serviceDebug元素中。
您可以通过删除try块中的CommunicationState检查来保存一些代码,然后只需调用:
client.Close();
如果抛出错误,catch块将捕获它并中止通道。
如果您尝试执行步骤1,则可能需要添加另一个catch块:
catch(FaultException) { }
另外,我会添加(用于调试目的)另一个catch块来处理Exception:
catch(例外) { }
很可能该服务正在抛出未处理的异常,这会使通信通道出错。希望我上面提到的一些内容将帮助您确定异常是什么,以便您可以解决它。