Не удается получить доступ к службе Net TCP из тестового клиента WCF
Я пытаюсь запустить две службы WCF из IIS, одна - веб-служба, а другая - служба привязки Net TCP.
Вот simulcrum моего Web.config (я анонимизировал имя сервиса):
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<services>
<service name="ServerService">
<endpoint address="ServerService"
binding="netTcpBinding"
bindingConfiguration=""
name="NetTcpEndPoint"
contract="IServerService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:8523/"/>
<add baseAddress="htt://localhost:8523/"/>
</baseAddresses>
</host>
</service>
<service name="MyWebService">
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration=""
name="AACCWSEndPoint"
contract="IMyWebService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8523/IMyWebService"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
Когда я запускаю это в IDE, он открывает страницу, работающую на порту 51953, и я могу получить WSDL для веб-службы, перейдя по http://localhost:51953/WebService.svc?wsdl (обратите внимание, что порт другой). Я не могу получить WSDL, изменив порт на то, что я указал в файле webconfig (8523).
Когда я указываю приложению WcfTestClient на "net.tcp://localhost:8523/ServerService, и оно выдает мне сообщение об ошибке, говоря, что оно не может получить доступ к метаданным, которые, насколько я вижу, я настроил (второй конечная точка в службе).
Что я здесь не так делаю?
ОБНОВИТЬ:
Я попытался изменить номер порта в свойствах проекта на 8523, как и предполагалось, что это не сработало, я также попытался изменить адрес конечной точки mex на "ServerService\mex", который тестовый клиент потратил некоторое время, но затем он выбросил следующую ошибку:
Ошибка: невозможно получить метаданные из net.tcp: // localhost: 8523 / ServerService. Если это служба Windows (R) Communication Foundation, к которой у вас есть доступ, убедитесь, что вы включили публикацию метаданных по указанному адресу. Справочную информацию о включении публикации метаданных см. В документации MSDN по адресу http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata URI ошибки обмена: net.tcp://localhost:8523/ServerService Metadata содержит ссылка, которая не может быть разрешена: "net.tcp://localhost:8523/ServerService". Вы попытались создать канал для службы, которая не поддерживает.Net Framing. Возможно, вы столкнулись с конечной точкой HTTP. Ожидаемый тип записи "PreambleAck", найдено "72".
Я собираюсь продолжать копать, но я был бы признателен за любую помощь.
ОБНОВЛЕНИЕ 2:
Я изменил конечную точку mex на mexTcpBinding: вот тег службы:
<endpoint address="ServerServiceWS"
binding="wsHttpBinding"
bindingConfiguration=""
name="WSEndPoint"
contract="IServerService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex"
binding="mexTcpBinding"
contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:8523/"/>
<add baseAddress="http://localhost:8523/"/>
</baseAddresses>
</host>
</service>
Все еще не повезло. Просто чтобы убедиться, что я ввожу правильный URL в тестер, который я использую:
net.tcp://localhost:8523/ServerService
Я также попробовал:
net.tcp://localhost:8523/mex
а также
net.tcp://localhost:8523/
Все это дает мне некоторую вариацию следующей ошибки:
Ошибка: невозможно получить метаданные из net.tcp: // localhost: 8523 / ServerService. Если это служба Windows (R) Communication Foundation, к которой у вас есть доступ, убедитесь, что вы включили публикацию метаданных по указанному адресу. Справочную информацию о включении публикации метаданных см. В документации MSDN по адресу http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata URI ошибки обмена: net.tcp://localhost:8523/ServerService Metadata содержит ссылка, которая не может быть разрешена: "net.tcp://localhost:8523/ServerService". Вы попытались создать канал для службы, которая не поддерживает.Net Framing. Возможно, вы столкнулись с конечной точкой HTTP. Ожидаемый тип записи "PreambleAck", найдено "72".
ОБНОВЛЕНИЕ 3
FWIW Я думаю, что может быть большая проблема с моим WEb.config Вот как это выглядит в настоящее время:
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<services>
<service name="ServerService">
<endpoint address=""
binding="netTcpBinding"
bindingConfiguration="DefaultBindingConfig"
name="NetTcpEndPoint"
contract="IServerService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex"
binding="mexTcpBinding"
contract="IMetadataExchange"
bindingConfiguration="mexBinding"/>
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:8523/"/>
</baseAddresses>
</host>
</service>
<service name="MyWebService">
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration=""
name="MyWSEndPoint"
contract="IMyWebService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange"
bindingConfiguration="mexHttpBinding"/>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8523/MyWebService"/>
</baseAddresses>
</host>
</service>
</services>
<bindings>
<netTcpBinding>
<binding name="DefaultBindingConfig"
maxConnections="5"
portSharingEnabled="true" >
</binding>
<binding name="mexBinding"
portSharingEnabled="true">
<security mode="None"></security>
</binding>
</netTcpBinding>
<mexTcpBinding>
<binding name="mexTcpBinding"/>
</mexTcpBinding>
<mexHttpBinding>
<binding name="mexHttpBinding"/>
</mexHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="ServerServiceBehaviour">
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true" />
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
<behavior name="MexBehaviour">
<serviceMetadata httpGetEnabled="true" policyVersion="Policy15"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
Я могу перейти к веб-сервису, и это позволяет мне получить WSDL, используя? Wsdl, но если я добавлю адрес http://localhost:8523/MyWebService в тестер WCF, то тоже выдаст ошибку.
Ошибка: невозможно получить метаданные из http://localhost:8523/MyWebService Если это служба Windows (R) Communication Foundation, к которой у вас есть доступ, убедитесь, что вы включили публикацию метаданных по указанному адресу. Для получения справки о включении публикации метаданных обратитесь к документации MSDN по адресу http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata URI ошибки обмена: http://localhost:8523/MyWebService Метаданные содержат ссылку это не может быть решено: 'http://localhost:8523/MyWebService'. Произошла ошибка при получении HTTP-ответа на http://localhost:8523/MyWebService. Это может быть связано с тем, что привязка конечной точки службы не использует протокол HTTP. Это также может быть связано с тем, что сервер прерывает контекст HTTP-запроса (возможно, из-за закрытия службы). Смотрите журналы сервера для более подробной информации. Основное соединение было закрыто: при получении произошла непредвиденная ошибка. Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом. Существующее соединение было принудительно закрыто удаленным hostHTTP GET Error URI: http://localhost:8523/MyWebService Произошла ошибка при загрузке "http: // localhost: 8523 / MyWebService". Запрос не выполнен с состоянием HTTP 404: не найдено.
Я думаю, что проблема связана с путями, или я просто помещаю неправильный URL в тестовое приложение. Либо это, либо я все еще не настроил метаданные правильно.
3 ответа
Для конечной точки HTTP необходимо перенастроить свойства проекта, чтобы она запускала определенную конечную точку web.config на порту 8523, если она размещена с использованием IIS Express. Используйте определенный порт (8523) вместо автоматически назначенного порта (51953).
Для метаданных TCP вам необходимо поддерживать конечную точку mex с поддержкой TCP (mexTcpBinding
).
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
Привязки net.tcp и HTTP должны быть установлены на разных портах IIS. Это может быть проверено с тем же портом или другим. Это потерпит крах в первом случае. Кроме того, вы можете использовать любые номера портов, которые вы хотите. В этом случае порт TCP можно изменить на 8524. Просто вы не можете использовать два отдельных протокола на одном и том же порту. С другой стороны, базовые адреса имеют смысл только для автономных служб. Здесь базовый адрес определяется по URL из IIS.
Просто постарайтесь сохранить все как есть, и измените ваш сервис внутри и вставьте его в ваш конфигурационный файл, он должен работать отлично. для тестирования net.tcp вы можете использовать SvcUtil.exe
<system.serviceModel>
<services>
<service name="MyWCFServices.HelloWorldService">
<endpoint
binding="netTcpBinding"
bindingConfiguration="ultra"
contract="MyWCFServices.IHelloWorldService"/>
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:8086/HelloWorldService.svc" />
<add baseAddress="http://localhost:8081/HelloWorldService.svc" />
</baseAddresses>
</host>
</service>
</services>
<bindings>
<netTcpBinding>
<binding name="ultra"
maxBufferPoolSize="2147483647"
maxBufferSize="2147483647"
maxReceivedMessageSize="2147483647"
portSharingEnabled="false"
transactionFlow="false"
listenBacklog="2147483647" >
<security mode="None">
<message clientCredentialType="None"/>
<transport protectionLevel="None" clientCredentialType="None"/>
</security>
<reliableSession enabled="false"/>
</binding>
</netTcpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>