C # WCF ДУПЛЕКСНЫЕ ПРОБЛЕМЫ - PullRequest
0 голосов
/ 17 февраля 2012

У меня есть служба WCF, которая требует взаимодействия сервер \ клиент и клиент \ сервер. Я начал этот квест, используя удаленное взаимодействие .NET, но несколько человек сообщили мне, что, возможно, мне стоит заняться WCF.

Итак, квест начался с того, что я изучил WCF, и я смог успешно создать свой Сервис и свое приложение, которое подписалось на мои события! Сервер уведомил клиента, и все были довольны, пока я не перенес приложение сервера на свой Сервер. Затем началось массовое количество вопросов.

Мой клиентский конфиг

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel"
          switchValue="Information, ActivityTracing"
          propagateActivity="true">
      <listeners>
          <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData="c:\log\Traces.svclog"  />
      </listeners>
   </source>
 </sources>
</system.diagnostics>
<system.serviceModel>
    <bindings>
        <wsDualHttpBinding>
            <binding name="WSDualHttpBinding_ICompany" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <reliableSession ordered="true" inactivityTimeout="00:10:00" />
                <security mode="Message">
                    <message clientCredentialType="Windows" negotiateServiceCredential="true"
                        algorithmSuite="Default" />
                </security>
            </binding>
        </wsDualHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://MyServer:8731/Design_Time_Addresses/WCFCallbacks/Message/"
            binding="wsDualHttpBinding" bindingConfiguration="WSDualHttpBinding_ICompany"
            contract="ServiceReference1.ICompany" name="WSDualHttpBinding_ICompany">
        </endpoint>
    </client>
</system.serviceModel>
</configuration>

Конфигурация моего сервера

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.web>
    <compilation debug="true" />
  </system.web>
<system.serviceModel>
<services>
  <service name="WCFTest.Company" behaviorConfiguration="WCFTest.Company">
    <host>
      <baseAddresses>
        <add baseAddress = "http://localhost:8731/Design_Time_Addresses/WCFCallbacks/Message/" />
      </baseAddresses>
    </host>
    <endpoint address ="" binding="wsDualHttpBinding" contract="WCFTest.ICompany">
      <identity>
        <dns value="localhost"/>
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="WCFTest.Company">
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="False" />
    </behavior>
  </serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>

Теперь я настроил свой app.config на Client , запустив службу на реальном Сервере, а затем в VS 2010, указав мою ServiceReference на этот сервер. Он успешно сгенерировал app.config! Кроме того, когда я запускаю клиентское приложение, я могу успешно запустить netstat и увидеть, что мой клиент действительно подключен. Проблема в том, что я получаю ошибки тайм-аута, ошибки SSPI и т. Д. Журнал трассировки настолько запутан и запутан, что я не вижу в этом никакого смысла.

Мои вопросы на данный момент: может кто-нибудь сказать мне, что я делаю неправильно? Кроме того, я должен был остаться с .NET Remoting (у меня не было рабочего решения с .NET Remoting)? Имейте в виду, я должен поддерживать двусторонний тип соединения.

Спасибо за ваше время!

РЕДАКТИРОВАТЬ 1

Вот мой netstat:

TCP xxx.xxx.xxx.xxx:8731 имя хоста: 63444 УСТАНОВЛЕНО

РЕДАКТИРОВАТЬ 2

Что ж, я закончил тем, что использовал NetTcpBinding для этого парня объяснения того, почему wsDualHttpBinding трудно реализовать. Затем я использовал эту парни статью о создании моего конфига.

Вот что я закончил:

Конфигурация сервера

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.web>
    <compilation debug="true" />
  </system.web>
<system.serviceModel>
<services>
  <service name="WCFTest.Company" behaviorConfiguration="WCFTest.Company">
    <host>
      <baseAddresses>
        <add baseAddress = "net.tcp://localhost:8731/WCFTest/Company" />
      </baseAddresses>
    </host>
    <endpoint address ="net.tcp://localhost:8731/WCFTest/Company" binding="netTcpBinding" contract="WCFTest.ICompany">
      <identity>
        <dns value="localhost"/>
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="WCFTest.Company">
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="False" />
    </behavior>
  </serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>

Client Config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.diagnostics>
    <sources>
  <source name="System.ServiceModel"
          switchValue="Information, ActivityTracing"
          propagateActivity="true">
    <listeners>
      <add name="traceListener"
          type="System.Diagnostics.XmlWriterTraceListener"
          initializeData="c:\log\Traces.svclog"  />
    </listeners>
  </source>
</sources>
</system.diagnostics>
<system.serviceModel>
    <bindings>
        <netTcpBinding>
            <binding name="NetTcpBinding_ICompany" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
                hostNameComparisonMode="StrongWildcard" listenBacklog="10"
                maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10"
                maxReceivedMessageSize="65536">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <reliableSession ordered="true" inactivityTimeout="00:10:00"
                    enabled="false" />
                <security mode="Transport">
                    <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
                    <message clientCredentialType="Windows" />
                </security>
            </binding>
        </netTcpBinding>
    </bindings>
    <client>
        <endpoint address="net.tcp://MyServer:8731/WCFTest/Company"
            binding="netTcpBinding" bindingConfiguration="NetTcpBinding_ICompany"
            contract="ServiceReference1.ICompany" name="NetTcpBinding_ICompany">
            <identity>
                <dns value="localhost" />
            </identity>
        </endpoint>
    </client>
</system.serviceModel>
</configuration>

Мне бы очень хотелось, чтобы Microsoft прекратила предоставлять плохие примеры. Это было настолько разочаровывающим, что моя единственная реализация для Duplex использует wsDualHttpBinding. Они даже не упоминают NetTcpBinding, и вам понадобится огромный опыт в этих технологиях, чтобы понять разницу. По крайней мере, для меня я все еще очень молод в моей жизни программиста. Спасибо двум людям, которые нашли время, чтобы объяснить NetTcpBinding и предоставили примеры, которые очень помогли моей реализации здесь.

...