WCF服务配置奇怪的行为 - 必须保护请求消息

时间:2011-07-18 17:31:51

标签: wcf configuration wcf-security

我在.NET 4.0上,我有一个wcf服务,它实现了两个合同,一个具有保护级别,另一个没有保护。两者都在Action和ReplyAction中指定“*”值。

现在,如果我在Web站点项目中配置此服务一切正常,但如果我在Web应用程序项目中配置相同的服务,如果我尝试在浏览器中查看默认端点的服务页面,我会收到错误“请求消息必须受到保护,这是合同操作所必需的('IContractSigned','http:// myservice / contracts')。保护必须由绑定提供('BasicHttpBinding','http: //tempuri.org/')。“

Web站点项目和Web应用程序项目都具有相同的web.config。

现在我正在尝试投资,但找不到简单的解决方案或讨论是不可能的。 任何的想法? 为什么项目类型以这种方式影响配置的正确性? 提前致谢

2 个答案:

答案 0 :(得分:1)

服务合同的EncryptAndSign保护级别要求绑定提供一些enrypting和歌唱方式,即绑定必须是安全的。

也许您的服务使用传输级安全性,依靠IIS通过其服务器证书之一保护通道?网站部署和Web应用程序部署之间的区别可能是IIS使用服务器证书保护通道的能力。

如果您使用消息模式安全性,您的服务必须声明要使用的证书,并且不应该如何区分服务。

答案 1 :(得分:0)

我正在努力解决同样的异常和found this

  

如果合同中没有明确指定保护级别且底层绑定支持安全性(无论是在传输级别还是消息级别),则整个合同的有效保护级别为ProtectionLevel.EncryptAndSign。如果绑定不支持安全性(例如BasicHttpBinding),则整个合同的有效System.Net.Security.ProtectionLevel为ProtectionLevel.None。结果是,根据端点绑定,即使合同指定了ProtectionLevel.None,客户端也可能需要不同的消息或传输级安全保护。

因此,如果未在ServiceContract属性中指定ProtectionLevel,WCF将根据您的web.config定义ProtectionLevel。如果您正在使用例如Ws2007和BasicHttpBinding,则BasicHttpBinding将因您的异常而失败。那么你有3个选择:

  1. 删除合同的所有安全绑定,只留下BasicHttpBinding。
  2. 设置通过BasicHttpBinding公开的合同的保护级别:

    [ServiceContract(ProtectionLevel = ProtectionLevel.None)]

  3. 为BasicHttpBinding提供一些安全性。