我在我的本地网络的一台机器上构建了一个WCF服务,它在IIS管理器中同时具有http和net.tcp(htpp,net.tcp)作为启用的协议。
从另一台计算机构建客户端应用程序,并使用“添加服务引用...”对话框自动定义端点,我键入服务地址,当它出现时,我设置名称并单击“确定”。 App.config使用两个端点进行更新,一个用于http(BasicHttpBinding),另一个用于net.tcp(NetTcpBinding),如预期的那样。
运行客户端应用程序时,如果我使用BasicHttpBinding:
“using(var proxy = new ProductsServiceClient(”BasicHttpBinding_IProductsService“))”
它运行正常,并显示预期的数据。
但是当我使用NetTcpBinding时:
“using(var proxy = new ProductsServiceClient(”NetTcpBinding_IProductsService“))”
抛出SecurityNegotiationException,说:
“在身份验证期间未满足远程安全要求。请尝试增加ProtectionLevel和/或ImpersonationLevel。”
如果我在同一台机器上完成所有工作,我不会有任何例外。
我该怎么办?
圣拉斐尔
答案 0 :(得分:2)
默认情况下,BasicHttpBinding不支持安全性。因此,当从另一台计算机调用该服务时,它也可以工作。 但默认情况下,NetTcpBinding需要安全通道。默认安全模式是Transport,因此当从另一台计算机调用该服务时,它将引发安全性异常。
解决问题的最简单方法是将安全模式设置为无,如下所示:
<bindings>
<netTcpBinding>
<binding name="netTcpBindingConfiguration" >
<security mode="None" />
</binding>
</netTcpBinding>
然后我们在端点
中使用它<endpoint address="net.tcp://nelson-laptop:8080/Whatever"
binding="netTcpBinding"
bindingConfiguration="netTcpBindingConfiguration"
contract="ProductsService.IProductsService"
name="NetTcpBinding_IProductsService" />
答案 1 :(得分:0)
在您的问题中,您使用的是默认的net.tcp端口 808 ,但已在防火墙中打开了端口 80 。如果它不是问题中的拼写错误,那可能就是它失败的原因。