Реализация WCF с использованием протокола NetTCP - PullRequest
1 голос
/ 22 февраля 2011

После успешного получения службы WCF и клиента для общения друг с другом по протоколу Http я сейчас пытаюсь подключить его к netTcp, чтобы можно было зашифровать связь. Однако у меня возникают проблемы с установлением соединения по этому протоколу.

После изменения файла App.config в службе и удаления ссылки на службу в клиентском проекте я пытаюсь повторно добавить ссылку на службу. Нажатие «обнаружить» находит службу, но в http с адресом http://localhost:31284/MyService.svc, который не является нигде указанным мной адресом: я предполагаю, что он должен быть по умолчанию. Если я пытаюсь добавить этот сервис, я получаю сообщение об ошибке:

HTML-документ не содержит веб служба обнаружения информации. Метаданные содержат ссылку, которая не может быть решен: «http://localhost:31284/MyService.svc'. Тип контента приложения / мыло + xml; charset = utf-8 не поддерживается оказание услуг http://localhost:31284/MyService.svc. Привязки клиента и сервиса могут быть несовпадающими. Удаленный сервер вернулся ошибка: (415) неподдерживаемый носитель Тип. Если услуга определена в текущее решение, попробуйте построить решение и добавление услуги ссылка снова.

В конфигурации моего приложения я указал адрес конечной точки как net.tcp: // localhost: 8732 / Design_Time_Addresses / NameSpace.ApiServices.Server / MyService. Если я вставлю этот адрес в окно справочника услуг и попытаюсь подключиться к нему или попытаться подключиться с помощью тестового клиента WCF, он также не будет выполнен. Оба выдают очень похожие ошибки:

Метаданные содержат ссылку, которая не может быть решен: 'Net.tcp: // локальный: 8732 / Design_Time_Addresses / NameSpace.ApiServices.Server / MyService. Не удалось подключиться к net.tcp: // локальный: 8732 / Design_Time_Addresses / NameSpace.ApiServices.Server / MyService. Попытка подключения продолжалась в течение промежуток времени 00: 00: 02.0142014. TCP код ошибки 10061: не удалось подключиться быть сделано, потому что целевая машина активно отказался от этого 127.0.0.1:8732. Соединение не может быть установлено, потому что целевая машина активно отказывалась 127.0.0.1:8732 Если служба определена в текущем решении, попробуйте построение решения и добавление сервисная ссылка снова.

Не уверен, что происходит. Оба работают на одной машине, и мой брандмауэр выключен. Я проверил netstat -a и не смог увидеть прослушивание TCP на порту 8732, но у меня включена и включена служба общего доступа к портам в моей конфигурации. Который выглядит так:

<bindings>
  <netTcpBinding>
    <binding portSharingEnabled="True" name="tcpBinding" closeTimeout="00:10:00" openTimeout="00:10:00" sendTimeout="00:10:00" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
      <security>
        <transport>
          <extendedProtectionPolicy policyEnforcement="Never" />
        </transport>
      </security>
    </binding>
  </netTcpBinding>
</bindings>

<behaviors>
  <serviceBehaviors>
    <behavior name="standard">
      <serviceDebug includeExceptionDetailInFaults="false" />
      <serviceMetadata />
    </behavior>
  </serviceBehaviors>
</behaviors>

<services>
  <service name="NameSpace.ApiServices.Server.MyService" behaviorConfiguration="standard">
    <endpoint address="" binding="netTcpBinding" bindingConfiguration="tcpBinding" contract="NameSpace.ApiServices.Server.IMyService">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8732/Design_Time_Addresses/NameSpace.ApiServices.Server/MyService/" />
      </baseAddresses>
    </host>
  </service>
</services>

Кто-нибудь может увидеть, что я делаю не так?

РЕДАКТИРОВАТЬ: меня попросили конфигурации моего клиента:

    <bindings>
      <netTcpBinding>
        <binding name="tcpBinding" closeTimeout="00:10:00" openTimeout="00:10:00" sendTimeout="00:10:00" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
          <security>
            <transport>
              <extendedProtectionPolicy policyEnforcement="Never" />
            </transport>
          </security>
        </binding>
      </netTcpBinding>
    </bindings>
    <client>
        <endpoint address=""
            binding="netTcpBinding" bindingConfiguration="tcpBinding"
            contract="NameSpace.Server.IUpdateCustomers" name="tcpBinding" />
    </client>
</system.serviceModel>

Ответы [ 2 ]

1 голос
/ 22 февраля 2011

ОК, наконец-то дошло до сути, если это кому-нибудь еще поможет. Для тега serviceMetdata необходимо, чтобы атрибут httpGetEnabled имел значение false:

 <serviceMetadata httpGetEnabled="false" />

В противном случае, я предполагаю, что он пытается раскрутить конечную точку на Http, а также Tcp и не работает.

0 голосов
/ 22 февраля 2011

После того как вы создали конечную точку tcp на сервере, вы должны убедиться, что вы также обновляете ссылку на стороне клиента.Первое, что я хотел бы проверить, это совместимость конечных точек на сервере и клиенте.Проверьте файл app.config на стороне клиента и убедитесь, что конечная точка tcp и здесь настроена правильно, а не только старая конечная точка http.

Кроме того, я считаю, что конечная точка mex для TCP не может работатьна том же порту, что и служба, поэтому попробуйте выставить конечную точку mex на другом порту tcp, отличном от основной конечной точки службы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...