Silverlight 故障传播和 UserNamePasswordValidator

Posted

技术标签:

【中文标题】Silverlight 故障传播和 UserNamePasswordValidator【英文标题】:Silverlight fault propagation and UserNamePasswordValidator 【发布时间】:2012-10-03 01:33:24 【问题描述】:

场景是使用 Wcf 服务和自定义身份验证的 Silverlight 客户端。为了缓解 500/200 状态码问题(避免 EndPointNotFound 异常),我应用了SilverLightFaultBehaviour。但是,这不适用于 UserNamePasswordValidator - 当从 Validate() 抛出 FaultException 时,SilverLightFaultMessageInspector 的 BeforeSendReply 实现不会捕获它。

到目前为止,我发现的唯一解决方法是改用替代客户端堆栈 (WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);),但使用它存在一些复杂性,因为我们的许多客户端都在虚拟机上,所以不能再忽略它, silverlight 客户端不断崩溃(Silverlight 5 - Debugging npctrl.dll crash,http://communities.vmware.com/thread/394306?tstart=0)。

我的主要动机是我希望能够区分登录失败和连接错误(以下代码来自客户端异步回调方法,仅适用于客户端堆栈):

if (e.Error is MessageSecurityException)

    this.HasLoginFailed.Value = Captions.Login_FailedLogin;

else

    this.HasLoginFailed.Value = Captions.Login_FailedConnection;

在从 UserNamePasswordValidator 抛出 FaultException 时,是否有其他方法可以修改发送的消息?或者任何概念上不同的自定义身份验证方式,而不是我正在使用的方式,这使我能够修改消息状态或将其保持为 200,或者只是能够区分连接失败和错误凭据?

我的用户名密码注册服务器端代码:

var serviceCredential = host.Description.Behaviors.Find<ServiceCredentials>();
serviceCredential.UserNameAuthentication.UserNamePasswordValidationMode =
                    UserNamePasswordValidationMode.Custom; 
serviceCredential.UserNameAuthentication.CustomUserNamePasswordValidator =
                    new MyValidator();

【问题讨论】:

【参考方案1】:

当您从MyValidator 抛出FaultException 时,它被包装为MessageSecurityExceptionInnerException,这可能是您无法直接将其作为FaultException 捕获的原因。

要为您抛出的错误添加一些信息,您可以添加FaultCode

throw new FaultException(
    "Invalid user name or bad password.",
     new FaultCode("BadUserNameOrPassword")
);

然后,在客户端捕获异常并检索您的FaultCode

try  ... 
catch (MessageSecurityException e)

    FaultException fault = (FaultException) e.InnerException;
    String faultCode = fault.Code.Name;
    // you can now display a meaningful error with the faultCode

希望对你有帮助!

【讨论】:

我的老问题 - 今天可能无关紧要,这个在 2013 年发布的修复 support.microsoft.com/en-us/kb/2814124 可能会减轻 WmWare 机器上除以 0 的错误。在任何情况下,问题是到达客户端的异常没有“键入”,也没有包含抛出异常中的任何信息。无法将一个异常与另一个异常区分开来 - 您的解决方案并不能缓解最初的问题。

以上是关于Silverlight 故障传播和 UserNamePasswordValidator的主要内容,如果未能解决你的问题,请参考以下文章

Silverlight 4中的IIS Windows身份验证问题

排除 JVM 堆大小设置未传播到应用程序的故障

Silverlight提示安装成功,可重新装软件的时候仍然提示安装,怎么办?

istio-故障注入

WPF和Silverlight区别

清华阿里AIOps新作:KPI波动关联分析助力故障排查