我正在尝试测试一个简单的WCF tcp.net客户端/服务器应用程序。 WCF服务托管在Windows 7 IIS上。我在IIS中启用了TCP.net。我通过配置具有管理员权限的应用程序池并将IIS服务应用程序设置为在上下文中运行,授予自由安全权限以服务应用程序。
我在服务应用上启用了跟踪功能以进行故障排除。每当我从WCF客户端应用程序运行针对服务的简单方法调用时,我都会遇到以下异常:
“http://www.w3.org/2005/08/addressing/anonymous需要”流安全性“,但未协商安全上下文。这可能是由远程端点从其绑定中丢失StreamSecurityBindingElement引起的。”
这是我的客户端配置:
<bindings>
<netTcpBinding>
<binding name="InsecureTcp">
<security mode="None" />
</binding>
</netTcpBinding>
</bindings>
这是我的服务配置:
<bindings>
<netTcpBinding>
<binding name="InsecureTcp" >
<security mode="None" />
</binding>
</netTcpBinding>
</bindings>
<services>
<service name="OrderService" behaviorConfiguration="debugServiceBehavior">
<endpoint
address=""
binding="netTcpBinding"
bindingConfiguration="InsecureTcp"
contract="ProtoBufWcfService.IOrder" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="debugServiceBehavior">
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
答案 0 :(得分:2)
WCF不喜欢不安全的通信 - 它默认使用安全可靠的通信通道。 netTcpBinding
的默认安全模式是具有Windows凭据的传输级安全性。你可以使用该默认值而不是关闭所有内容吗?
如果您的服务器计算机和所有调用它的客户端位于同一公司LAN上,在防火墙后面,那么不使用Windows凭据就没有意义了。为此,请使用此绑定配置:
<bindings>
<netTcpBinding>
<binding name="InsecureTcp">
<security mode="Transport">
<transport clientCredentialType="Windows" />
</security>
</binding>
</netTcpBinding>
</bindings>
该安全功能非常快,通常在网卡上的硬件中实现,并且在组织内部使用Windows凭据通常是最佳方式。
那么为什么要禁用netTcpBinding
上的所有安全性并让自己陷入麻烦?
答案 1 :(得分:0)
Macr_s回答适用于Windows 2008。
请注意,当您在本地/开发Windows 7中尝试上述操作时,事情将无需安全保护。
请不要修改您的APP池,保留默认的应用程序池,它正在运行