我有单声道完成2个WCF自托管应用程序。一个在Windows 8上,另一个在Ubuntu Linux上。当我将这两个应用程序放在Windows8或Ubuntu下时,它们可以正常通信。当我把它们分开时,一个在Windows中,一个在Linux中,我得到一个“System.IO.IOException:Read Failure ---> System.Net.Sockets.SocketException:Connection by peer重置。
我已经阅读了有关此错误的每一页,但没有运气如何解决它。 我攻击两个应用程序的app.config。他们使用net.TCP进行通信,svcutil工作正常,拉动元数据。
CLIENT App.config(这个尝试从另一个中提取数据,当他收集数据时,调用第三个未实现的服务。)
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="NetTcpBinding_IMiServicio" >
<security mode="None"/>
</binding>
</netTcpBinding>
</bindings>
<client>
<endpoint address="net.tcp://192.168.1.101:8090/ProyectoDistribuidoTCP"
binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IMiServicio"
contract="IMiServicio" name="NetTcpBinding_IMiServicio">
<identity>
<userPrincipalName value="ALEXMAINGEAR\Alex" />
</identity>
</endpoint>
</client>
</system.serviceModel>
</configuration>
SERVER App.config(此服务将数据提供给第二个服务)
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<services>
<service name="ProyectoDistribuido.MiServicio" behaviorConfiguration="metadataSupport">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/ProyectoDistribuidoHTTP"/>
<add baseAddress="net.tcp://localhost:8090/ProyectoDistribuidoTCP"/>
</baseAddresses>
</host>
<endpoint binding="basicHttpBinding"
contract="ProyectoDistribuido.IMiServicio"/>
<endpoint binding="netTcpBinding"
contract="ProyectoDistribuido.IMiServicio"/>
<endpoint address= "tcpmex"
binding="mexTcpBinding"
contract="IMetadataExchange"/>
</service>
</services>
<bindings>
<netTcpBinding>
<binding name="netTcpBinding">
<security mode= "None"/>
</binding>
</netTcpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="metadataSupport">
<serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
答案 0 :(得分:0)
我知道这篇文章相当陈旧,但我最近发现自己处于类似的情况,网上的信息仍然很少。
就我而言,问题是net.tcp
绑定默认使用基于Windows身份验证的安全性。
当两个服务都在Windows中时,这很好,但是当一个服务在Linux中托管时,它无法访问它(除非你已经配置它)并且连接失败。
错误信息肯定会有所不足!
这是我使用net.tcp
绑定禁用安全性(因为我还不需要)的配置。
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="bindingConfig">
<security mode="None">
<transport clientCredentialType="None" protectionLevel="EncryptAndSign" />
<message clientCredentialType="None" algorithmSuite="Default" />
</security>
</binding>
</netTcpBinding>
</bindings>
<!-- remainder of system.serviceModel -->
注意:您还需要配置服务客户端以禁用安全性。在我的情况下,我的客户端没有.config文件,所以我必须在代码中执行:
var binding = new NetTcpBinding()
{
MaxBufferSize = int.MaxValue,
ReaderQuotas = System.Xml.XmlDictionaryReaderQuotas.Max,
MaxReceivedMessageSize = int.MaxValue,
Security = new NetTcpSecurity()
{
Message = new MessageSecurityOverTcp()
{
ClientCredentialType = MessageCredentialType.None
},
Transport = new TcpTransportSecurity()
{
ClientCredentialType = TcpClientCredentialType.None
},
Mode = SecurityMode.None
}
};