我正在创建一个WCF Web服务,其请求/响应应该只签名。为此,在服务合同属性上,我设置了
ProtectionLevel = ProtectionLevel.Sign
这工作正常。
由于需求,一些 SoapFaults 应该从服务中抛出;两种类型的 SoapFaults:
- 与应用相关
- 与 WS 寻址相关(例如,缺少消息 ID)
为此,我使用处理SoafFaults的常规方法:创建一个IErrorHandler,其中使用MessageFault.CreateFault创建一个消息实例。
几乎所有返回的 SoapFaults 都没有加密(这对我来说没关系),我的问题是为什么带有 action="http://www.w3.org/2005/08/addressing/fault" 或"http://www.w3.org/2005/08/addressing/soap/fault"的那些是加密的?
查看 http://msdn.microsoft.com/en-us/library/aa347791.aspx 和 http://msdn.microsoft.com/en-us/library/system.servicemodel.faultcontractattribute.aspx。它指出
如果选择启用安全性的绑定,并且未设置 保护级别属性在合同上的任何地方,所有应用程序 数据将被加密和签名。
我猜默认情况下内置类型使用这种行为。您可以通过查看实际引发的异常来验证这一点。