Базовая HTTP и NetTCP привязка WCF, выставляющая оба через Mex - PullRequest
2 голосов
/ 25 января 2011

У меня возникли трудности с настройкой службы WCF. Мое требование заключается в том, чтобы он предоставлял конечную точку basicHttpBinding, а также конечную точку netTcpBinding. Некоторые из моих клиентов - это .NET 2.0, и они должны иметь возможность генерировать прокси через WSDL.exe.

Кажется, это работает по большей части - но когда я пытаюсь получить WSDL, он не сотрудничает. В браузере он возвращает мне некоторые теги SOAP XML, но определенно не полный WSDL. WSDL.exe выдает мне серию ошибок:

Ошибка: произошла ошибка при обработке 'http://1.2.3.4:9877/MyService/basicHttp?wsdl'.

  • Документ понят, но не может быть обработан.
  • Документ WSDL содержит ссылки, которые не могут быть разрешены.
  • Произошла ошибка при загрузке 'http://localhost:9877/MyService/basicHttp?wsdl=wsdl0'.
  • Базовое соединение было закрыто: невозможно подключиться к удаленному серверу.

Вот моя конфигурация хоста. Здесь что-то выскакивает как неправильное?

<system.serviceModel>
  <services>
    <service behaviorConfiguration="MyServiceBehavior" name="MyRunner">
      <endpoint address="netTcp" binding="netTcpBinding" bindingConfiguration="" contract="IMyRunner">
        <identity>
          <dns value="localhost" />
        </identity>
      </endpoint>
      <endpoint address="basicHttp" binding="basicHttpBinding" bindingConfiguration="" contract="IMyRunner">
      </endpoint>
      <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" contract="IMetadataExchange" />
      <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="" contract="IMetadataExchange" />
      <host>
        <baseAddresses>
          <add baseAddress="net.tcp://localhost:9876/MyService/netTcp" />
          <add baseAddress="http://localhost:9877/MyService/basicHttp" />
        </baseAddresses>
      </host>
    </service>
  </services>
  <behaviors>
    <serviceBehaviors>
      <behavior name="MyServiceBehavior">
        <serviceMetadata httpGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="false" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

Ответы [ 2 ]

1 голос
/ 25 января 2011

Если у вас есть две конечные точки MEX, каждая из которых нуждается в отдельном адресе - назовите один «mex», затем назовите другой «mex2» или что-то еще:

<service behaviorConfiguration="MyServiceBehavior" name="MyRunner">
      <endpoint address="netTcp" binding="netTcpBinding" bindingConfiguration="" contract="IMyRunner">
        <identity>
          <dns value="localhost" />
        </identity>
      </endpoint>
      <endpoint address="basicHttp" binding="basicHttpBinding" bindingConfiguration="" contract="IMyRunner">
      </endpoint>
      <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" contract="IMetadataExchange" />
      <endpoint address="mex2" binding="mexTcpBinding" bindingConfiguration="" contract="IMetadataExchange" />
      <host>
        <baseAddresses>
          <add baseAddress="net.tcp://localhost:9876/MyService/netTcp" />
          <add baseAddress="http://localhost:9877/MyService/basicHttp" />
        </baseAddresses>
      </host>
    </service>

(ОК, поэтому, согласно комментариям ОП, он не размещается в IIS, так что это не имеет значения)

Также: вы хостинг в IIS? В этом случае ваши базовые адреса (по крайней мере, HTTP) не имеют смысла - сервер, виртуальный каталог и местоположение файла SVC будут определять ваш служебный адрес:

http://YourServer/YourVirtualDirectory/SubDirectory/YourService.svc/basicHttp

для вашей "нормальной" сервисной конечной точки или

http://YourServer/YourVirtualDirectory/SubDirectory/YourService.svc/mex

для вашей конечной точки MEX на основе HTTP.

0 голосов
/ 25 января 2011

Спасибо за советы, ребята.Оказывается, проблема была в значениях baseAddress, указывающих на «localhost».В сгенерированном WSDL по-прежнему говорится «localhost», поэтому WSDL.exe, очевидно, пытается получить доступ к localhost (моей машине разработчика) вместо сервера.Я изменил «localhost» на фактический IP-адрес сервера, на котором размещена служба, и WSDL.exe работал успешно, даже в .NET 1.1.И я все еще могу получить версию 4.0, используя svcutil.exe.

...