Я желаю получить сервисную работу WCF-TCP. У меня были некоторые проблемы с изменением моего собственного проекта, таким образом, я думал, что запущу с "основного" шаблона WCF, включенного в VS2008.
Вот начальная буква WCF App.config и когда я выполняю сервис, Тестовый Клиент WCF может работать с ним прекрасный:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<compilation debug="true" />
</system.web>
<system.serviceModel>
<services>
<service name="WcfTcpTest.Service1" behaviorConfiguration="WcfTcpTest.Service1Behavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8731/Design_Time_Addresses/WcfTcpTest/Service1/" />
</baseAddresses>
</host>
<endpoint address="" binding="wsHttpBinding" contract="WcfTcpTest.IService1">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="WcfTcpTest.Service1Behavior">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Это работает отлично, никакие проблемы вообще.
Я изобразил изменение, это от HTTP до TCP будет тривиально: измените привязку к их эквивалентам TCP и удалите элемент httpGetEnabled serviceMetadata:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<compilation debug="true" />
</system.web>
<system.serviceModel>
<services>
<service name="WcfTcpTest.Service1" behaviorConfiguration="WcfTcpTest.Service1Behavior">
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:1337/Service1/" />
</baseAddresses>
</host>
<endpoint address="" binding="netTcpBinding" contract="WcfTcpTest.IService1">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="WcfTcpTest.Service1Behavior">
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Но когда я выполняю это, я получаю эту ошибку в Сервисном Хосте WCF:
Система. InvalidOperationException: название контракта 'IMetadataExchange' не могло быть найдено в списке контрактов, реализованных сервисом Service1. Добавьте ServiceMetadataBehavior к конфигурационному файлу или к ServiceHost непосредственно для включения поддержки этого контракта.
Я получаю чувство, что Вы не можете отправить метаданные с помощью TCP, но это имеет место, почему там mexTcpBinding опция?
Что ж, если вы хотите иметь метаданные - TCP или HTTP - вам все равно нужно включить serviceMetadata
поведение!
<behaviors>
<serviceBehaviors>
<behavior name="WcfTcpTest.Service1Behavior">
<serviceDebug includeExceptionDetailInFaults="True" />
<serviceMetadata />
</behavior>
</serviceBehaviors>
</behaviors>
Конечно, у вас не может быть «HttpGetEnabled», но должно присутствовать само поведение, чтобы разрешить обмен метаданными (и, следовательно, контракт IMetadataExchange
).