Могу ли я использовать netTcpBinding для служб WCF, размещенных за пределами IIS?

Моя служба WCF размещается как управляемая служба Windows, поэтому я не уверен, могу ли я по-прежнему использовать netTcpBinding. Я пытался следовать нескольким руководствам в MSDN, но по какой-то причине моя служба всегда не запускается всякий раз, когда я переключаюсь с basicHttpBinding. Возможно, есть дополнительные шаги, которые должны пройти службы за пределами IIS?


person rafale    schedule 24.05.2011    source источник
comment
Вы должны быть в состоянии сделать это. Можете ли вы поделиться соответствующими битами конфигурации?   -  person Tad Donaghe    schedule 24.05.2011
comment
netTcpBinding доступен для конечных точек службы Windows. Можете ли вы дать нам больше контекста (сообщения об ошибках, информацию об определении службы и т. д.)   -  person dlev    schedule 24.05.2011
comment
@Terry @dlev: я использую installutil.exe для запуска службы, которая работает за пределами VS2010, поэтому я не уверен, как получить сообщение об исключении. Вот мой app.config: pastebin.com/s3ibabxw   -  person rafale    schedule 24.05.2011
comment
в вашей конфигурации есть некоторые ошибки, например, baseAddress — это http, и вы включаете httpGetEnabled для метаданных, а вашей конечной точкой является HTTP. Пожалуйста, возьмите пример из моего ответа.   -  person Alex Aza    schedule 24.05.2011


Ответы (2)


Да, вы можете разместить службу WCF с помощью netTcpBinding вне IIS, в службе Windows или даже в консольном приложении, если хотите.

Вот пример файла конфигурации:

<system.serviceModel>
  <behaviors>
    <serviceBehaviors>
      <behavior name="ServiceBehavior">
        <serviceMetadata />
        <serviceDebug includeExceptionDetailInFaults="true" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <services>
    <service behaviorConfiguration="ServiceBehavior"
             name="XX.XX.Service">
      <endpoint address=""
                binding="netTcpBinding"
                bindingConfiguration="BindingConfiguration"
                contract="XX.XX..IService" />
      <endpoint address="mex"
                binding="mexTcpBinding"
                contract="IMetadataExchange" />
      <host>
        <baseAddresses>
          <add baseAddress="net.tcp://localhost:8731/XXService" />
        </baseAddresses>
      </host>
    </service>
  </services>
  <bindings>
    <netTcpBinding>
      <binding
        name="BindingConfiguration">
        <security mode="None" />
      </binding>
    </netTcpBinding>
  </bindings>
</system.serviceModel>

[Изменить]

Проблемы с файлом конфигурации:

  • базовый адрес http вместо net.tcp
  • конечной точкой метаданных является mexHttpBinding вместо metTcpBinding
  • безопасность - по умолчанию будет использоваться авторизация Windows, если проверить связь между ящиками, у вас могут возникнуть проблемы с разрешением. Я предлагаю начать с режима безопасности None, а затем настроить безопасность, когда все остальное заработает.
  • вам не нужно указывать httpGetEnabled для поведения службы
  • если порт, который вы собираетесь использовать, уже используется, вы не сможете запустить службу
person Alex Aza    schedule 24.05.2011

Вы абсолютно можете, и я бы сказал, что вы должны.

Вот ваша проблема:

<services>
   <service name="Server.FileService" ...
      <host>
         <baseAddresses>
            <add baseAddress="http://localhost:8000/Test/file"/>
         </baseAddresses>
      </host>
      <endpoint address="" binding="netTcpBinding" contract="Server.IFile" />
      <endpoint address="mex" binding="mexHttpBinding" ...

Адрес net.tcp должен иметь префикс net.tcp://, а не префикс http://.

Я обычно не использую baseAddress, поэтому не могу дать совет по этому поводу. Я бы удалил baseAddress и вместо этого использовал

      <endpoint address="net.tcp://localhost:8001/Test/file" ..

(обратите внимание, что я бы также выбрал другой порт вместо 8000)

person Kirk Broadhurst    schedule 24.05.2011