【发布时间】:2009-07-20 15:04:04
【问题描述】:
我有一个 WCF 服务,我使用自定义 UserNamePasswordValidator 和在 wsHttpBinding 上运行的消息安全性来保护它。发布代码效果很好。不幸的是,当我在以前使用无效凭据(当前凭据有效!)之后尝试在调试模式下运行时,VS2008 会显示一个烦人的对话框(更多内容见下文)。
验证器中我的 Validate 方法的简化版本可能如下所示:
public override void Validate(string userName, string password)
{
if (password != "ABC123")
throw new FaultException("The password is invalid!");
}
客户端收到一个 MessageSecurityException,其中 InnerException 设置为我明确抛出的 FaultException。这是可行的,因为我的客户端可以显示我希望用户看到的原始 FaultException 的消息文本。
不幸的是,在所有后续的服务调用中,VS2008 都会显示“无法自动调试...”对话框。我可以阻止这种情况发生的唯一方法是退出 VS2008,重新进入并使用正确的凭据连接到我的服务。我还应该补充一点,即使我在每次通话中都创建了一个全新的代理,也会发生这种情况。拨打电话时,我的频道不可能出现故障。但是,VS2008 很可能会挂在先前出现故障的通道上并尝试将其用于调试目的。
不用说,这很糟糕!我输入“坏”凭据的全部原因是为了测试“坏凭据”处理。
无论如何,如果有人对我如何解决这个错误有任何想法(?!?)我会非常感激......
【问题讨论】:
-
不是一个答案,但是通过让您的服务返回一个包含将显示给用户的消息的故障,您已经将您的服务与您的 UI 耦合。另外,仅供参考,切勿通过告诉黑客密码无效来告诉黑客用户名有效。说“用户名或密码无效”。
-
您能描述一下您是如何清理代理的吗?此外,完全不相关,但使用异常传播返回值通常不是一个好主意。您应该为特殊情况保留例外,而不仅仅是用户没有输入正确的用户名/密码。