2012-04-13 3 views
9

Я немного запутался о том, как выставить конечную точку в WCFподвергая net.tcp конечной

У меня есть TCP конечную точку и MEX TCP конечную точку.

<service name="MessageReaderService.MessageReaderService"> 
    <endpoint name="NetTcpReaderService" 
     address="ReaderService" 
     binding="netTcpBinding" bindingConfiguration="" 
     contract="Contracts.IMessageReaderService" /> 
    <endpoint name="netTcpMex" 
     address="mex" 
     binding="mexTcpBinding" bindingConfiguration="" 
     contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
      <add baseAddress="net.tcp://localhost:8082" /> 
     </baseAddresses> 
    </host> 
</service> 

Когда я пытаюсь запустить это в хост службы я получаю следующее исключение:

Имя контракта «IMetadataExchange» не может быть найден в списке контрактов реализуемого MessageReaderService услуг , Добавьте ServiceMetadataBehavior в файл конфигурации
или в ServiceHost, чтобы включить поддержку этого контракта.

Поэтому я пришел к выводу из этой ошибки, что мне нужно добавить поведение службы для отображения метаданных.

Поэтому я добавил поведение:

<behavior name="ServiceBehavior"> 
    <serviceMetadata httpGetEnabled="true"/>     
</behavior> 

, но затем я получаю другую ошибку:

HttpGetEnabled свойство ServiceMetadataBehavior устанавливается истина и HttpGetUrl свойство относительный адрес, но нет http-адреса. Либо укажите базовый адрес http, либо установите HttpGetUrl на абсолютный адрес.

  1. Так что теперь у меня есть на самом деле добавить другую конечную точку (HTTP), чтобы разоблачить метаданные над mexhttpbinding?
  2. Есть ли простой способ разоблачить конечную точку над tcp?

ответ

16

Две вещи:

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

<service name="MessageReaderService.MessageReaderService" 
     behaviorConfiguration="ServiceBehavior"> 

(2) вам не нужен HTTP конечная точка - вам не нужно иметь HTTP URL - просто определить такое поведение службы, как это:

<behavior name="ServiceBehavior"> 
    <serviceMetadata /> 
</behavior> 

метаданных теперь доступен над конечной точкой mexTcpBinding - вы не можете перейти к ней с помощью HTTP, но клиент может определенно подключиться к ней и использовать ее!

Вы можете проверить это с помощью WCF Test Client и собираюсь либо

net.tcp://localhost:8082  (the base address) 

или

net.tcp://localhost:8082/mex (the mex address) 

в обеих случаях клиент Test WCF теперь должен найти свою службу и быть в состоянии обнаружить его возможностей.

Смежные вопросы