我正在尝试使用ProtectionLevel属性在WCF Web服务上设置安全性:
[ServiceContract(ProtectionLevel= ProtectionLevel.EncryptAndSign)]
这会编译,但是当我尝试更新另一个项目(同一解决方案)中的服务引用时,Visual Studio会抛出异常。
System.InvalidOperationException:The 请求消息必须受到保护。 这是操作所必需的 合约 ( 'IStorageService', 'tempuri.org/')。 必须由保护提供保护 捆绑 ( '的WSHttpBinding', 'tempuri.org/')。
我还需要设置什么才能让它发挥作用?
答案 0 :(得分:7)
您的ServiceContract属性指定服务需要一个安全通道用于所有操作,消息签名(消息包含可以证明它未被篡改的数字签名)和消息加密(字节的消息在通过网络传输时被加密)。
您的客户端代码(即在调用服务的项目中)必须满足这些要求。如果此项目使用BasicHttpBinding和默认设置,则不会满足服务的要求(默认情况下,BasicHttpBinding禁用安全性)。如果您将客户端项目配置为使用WsHttpBinding,而使用其默认设置,则异常应该消失(此绑定默认启用EncryptAndSign)。
答案 1 :(得分:1)
ProtectionLevel是开发人员设置绑定必须遵守的最低级别的一种方式。部署服务时,配置中指定的实际绑定可能支持也可能不支持最低级别。例如,默认情况下,BasicHttpBinding类不提供安全性(尽管可以启用它)。因此,将其与具有除None之外的任何设置的契约一起使用将导致抛出异常。见here