2013-12-08 3 views
2

У меня есть 2 WCF-Self-Hosted Приложения с моно. Один находится на Windows 8, а другой - на Ubuntu Linux. Когда я помещаю оба приложения под Windows8 или Ubuntu, они обмениваются данными. Когда я размещаю их отдельно, один в Windows и один в Linux, я получаю «System.IO.IOException: Read Failure ---> System.Net.Sockets.SocketException: соединение сброшено с помощью одноранговой сети.MONO WCF Self-Hosted Service Pair получение соединения сброс с помощью peer при использовании net.tcp

У меня есть прочитайте каждую страницу, которую я могу найти об этой ошибке, не повезло, как ее исправить. i я атакую ​​приложение app.config обоих приложений. Они обмениваются данными с помощью net.TCP, а svcutil отлично работал с метаданными.

КЛИЕНТ App.config (Это один пытается вытащить данные из других, и когда он собирает данные, называет 3rd Не реализованное Еще обслуживание.)

<?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

я играл что-то похожее несколько лет назад (~ Моно 2,6 или 2,8, Net.Tcp привязки, Windows Server с использованием .NET и Ubuntu Client с использованием Mono), и я не мог заставить его работать. Я решил, что двоичная сериализация несовместима между двумя режимами (по крайней мере, в то время). На вашей стороне Windows вы работаете в .NET или Mono? – TheNextman

+0

Моно на обоих. Я установил Monodevelop на стороне Ubuntu и Xamarin Studio на Windows Side, оба из которых выполняли Mono (подумали разные версии, но не слишком приурочены друг от друга). – AlexFormoso

+0

Как вы его используете на стороне Windows? Просто потому, что вы используете XS, это не значит, что вы используете Mono. Конечно, с MonoDevelop, если вы специально не настроили его на использование Mono в Windows, он по умолчанию выполнил .NET-среду выполнения ... Стоит дважды проверить :) – TheNextman

ответ

0

Я знаю этот пост довольно старый, но в последнее время я оказался в подобной ситуации, и есть еще очень мало информации об этом в Интернете ,

В моем случае проблема заключалась в том, что привязка net.tcp по умолчанию используется для обеспечения безопасности на основе 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 
    } 
};