【发布时间】: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