【发布时间】: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();
【问题讨论】:
标签: wcf silverlight exception authentication