2

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

到目前为止,我发现的唯一解决方法是使用替代客户端堆栈WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);Silverlight 5 - 调试 npctrl.dll 崩溃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();
4

1 回答 1

0

当您抛出 a FaultExceptionfromMyValidator时,它被包装为InnerExceptionof a MessageSecurityException,这可能就是您无法直接将其捕获为 a 的原因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
}

我希望它会有所帮助!

于 2015-05-12T18:44:20.767 回答