【发布时间】:2019-05-28 12:37:48
【问题描述】:
我有一个自托管的 C# WCF .Net 4.6.1 Windows 服务,它与另一个自托管的 WCF 服务进行通信。当两个服务都在同一台服务器上时,这可以正常工作。但是,当我将服务器移动到另一台计算机时,我收到此错误:
System.ServiceModel.CommunicationException:套接字连接已中止。这可能是由于处理您的消息时出错或远程主机超出接收超时,或者是潜在的网络资源问题引起的。两台计算机上都没有运行防火墙,我在使用http://192.168.1.129:6253/eTutorWcfService(在应用程序中使用 net.tcp)时得到响应。
客户app.config:
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IeTutorMessage" />
</basicHttpBinding>
<netTcpBinding>
<binding name="NetTcpBinding_IeTutorMessage" />
</netTcpBinding>
</bindings>
<client>
<endpoint name="BasicHttpBinding_IeTutorMessage"
address="http://localhost:6253/eTutorWcfService"
binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IeTutorMessage"
contract="eTutorServiceReference.IeTutorMessage" />
<endpoint name="NetTcpBinding_IeTutorMessage"
address="net.tcp://localhost:6254/eTutorWcfService"
binding="netTcpBinding"
bindingConfiguration="NetTcpBinding_IeTutorMessage"
contract="eTutorServiceReference.IeTutorMessage" >
<identity>
<servicePrincipalName value = ""/>
</identity>
</endpoint>
</client>
服务器app.config:
<services>
<service name="eTutorServer.eTutorWcfService"
behaviorConfiguration="myeTutorServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:6253/eTutorWcfService"/>
<add baseAddress="net.tcp://localhost:6254/eTutorWcfService"/>
</baseAddresses>
</host>
<endpoint
address="http://localhost:6253/eTutorWcfService"
binding="basicHttpBinding"
contract="eTutorServer.IeTutorMessage" />
<endpoint
address="net.tcp://localhost:6254/eTutorWcfService"
binding="netTcpBinding"
contract="eTutorServer.IeTutorMessage" />
<endpoint
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange"/>
<endpoint
address="mex"
binding="mexTcpBinding"
contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="myeTutorServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
客户端代码:
EndpointAddress address = new EndpointAddress("net.tcp://" + eTutorServiceIp + ":6254/eTutorWcfService");
eTutorServiceReference.IeTutorMessageClient client = new eTutorServiceReference.IeTutorMessageClient("NetTcpBinding_IeTutorMessage", address);
try
{
rtn = client.eTutorMessage(itm);
client.Close();
}
当客户端尝试连接时,服务器的输出窗口会显示SecurityTokenValidationException,但我不确定该怎么做,或者它是否意味着相关。我确定这与安全性有关,但我不知道在哪里添加。
【问题讨论】:
-
本地主机可能在两台电脑上配置不同。检查主机文件:C:\Windows\System32\Drivers\etc\hosts
-
两台计算机上的 hosts 文件中都没有条目。
-
使用像wireshark或fiddler这样的嗅探器,比较工作PC和非工作PC上的结果。查看 http 响应状态,看看您是否完成了 200。还要检查 TCP 以查看是否收到 [FIN],它会终止指示完成的 TCP 连接。
-
也许您在客户端配置中输入的
<identity> <servicePrincipalName value = ""/> </identity>与SecruityTokenValidationException有关。我不知道,为什么它在配置中。 -
在身份上,它会在某个时候使用“msi/steve”(主机名/用户)自动添加。我已经取出了值和节点,但得到了同样的错误。
标签: c# wcf wcf-security self-host-webapi