MONO WCF自托管服务使用net.tcp时,可以通过对等方重置连接

时间:2013-12-08 19:30:16

标签: linux windows wcf mono net.tcp

我有单声道完成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>

1 个答案:

答案 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
    }
};