我有一个WCF服务,配置为通过System.IdentityModel.Selectors.UserNamePasswordValidator类的重写Validate()方法使用自定义UserName验证。
合同的所有方法都使用FaultContractAttribute进行修饰,以将自定义SOAP错误指定为可返回的。
当抛出FaultException< T>时,其中T是FaultContractAttribute中指定的类型,一切都按预期运行,我在响应XML中得到自定义错误。
但是,如果我尝试抛出FaultException< T>在用户名认证类的重写Validate()方法中,我得到一个通用的SOAP错误,原因如下:
“此故障的创建者未指定原因。”
但是,如果我更改代码以抛出一般SOAP错误,如:
throw new FaultException("Authentication failed.");
我至少会得到“身份验证失败”。在原因元素。
我的问题是:
任何帮助非常感谢。我自己的猜测是,在消息与合同的任何方法相关联之前进行身份验证,因此,与FaultContractAttribute没有关联,但是任何确认这一点并给出解决方法的文章都非常有用。
塔利
答案 0 :(得分:0)
这有点令人讨厌,但我做到了这一点:
SecurityTokenValidationException stve = new SecurityTokenValidationException("Invalid username or password"); throw new FaultException<SecurityTokenValidationException>(stve, stve.Message);
另外包含该消息意味着您没有得到愚蠢的“没有指定原因”的消息。
答案 1 :(得分:0)
问题是自定义验证代码是在任何特定OperationContract
的上下文之外运行的,因此WCF没有FaultContract
处理的位置。所以简短的回答是否定的,你不能从你的自定义验证器中获得例外来尊重FaultContract
。
这里有几个选项。我更喜欢的是抛弃非泛型FaultException
并提供预先确定的FaultCode
;通过这种方式,我的catch块可以将合同故障与“管道”故障区分开来。请注意,您从自定义验证程序中抛出的任何异常都应该以{{1}}的形式返回,如下所示:
MessageSecurityException