#wcf #endpoint
#wcf #конечная точка
Вопрос:
Я только изучаю wcf и не могу понять одну очень простую вещь.
Я создаю службу WCF, которую я хочу размещать в IIS точно так же, как веб-приложение, со своим собственным путем http://myhost/myapp/
и всем остальным.
Я создаю проект службы WCF в VS, у меня есть *.svc
файл, описывающий его, затем я определяю для него простую конечную точку следующим образом:
<endpoint address=""
binding="basicHttpBinding"
contract="wcf_service_auth.IPshService" />
Затем я публикую эту службу как веб-приложение IIS в виртуальном каталоге, предположим, это имя psh_pub
, поэтому я могу получить доступ к службе по URL http://localhost/psh_pub/pshservice.svc/
. Он показывает мне страницу приветствий WCF и дает мне ссылку на WSDL, которая дает мне правильное описание wsdl.
Все в порядке.
Следующий шаг — я хочу добавить конечную точку MEX. Я добавляю в конфигурацию:
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange"/>
Это тоже нормально, конечная точка доступна по адресу http://localhost/psh_pub/pshservice.svc/mex
и WcfTestClient.exe
дает мне правильную конфигурацию с этого URL.
Здесь возникает проблема.
У меня есть служба WCF, работающая под управлением IIS, и я хочу добавить к ней еще одну конечную точку. Например, пусть это будет net.tcp
конечная точка. IIS по умолчанию настроен на прием net.tcp
подключений через порт 808, и я добавляю net.tcp
протокол в свойства моего веб-приложения, и я хочу добавить конечную точку в свою службу таким образом:
<endpoint address=""
binding="netTcpBinding"
contract="wcf_service_auth.IPshService" />
и теперь я предполагаю, что моя служба должна быть доступна через URL net.tcp://localhost:808/psh_pub/pshservice.svc
. Но это не так. И в каждом «практическом руководстве» и руководстве в Интернете говорится, что я должен указать полный адрес в файле конфигурации следующим образом:
<endpoint address="net.tcp://localhost:808/psh_pub/pshservice.svc"
binding="netTcpBinding"
contract="wcf_service_auth.IPshService" />
И если я это сделаю, это сработает. Но если разместить службу в другом виртуальном каталоге, мне нужно будет изменить конфигурацию. Если я размещу его на другом сервере, мне нужно будет изменить конфигурацию. Если я размещу его на нескольких серверах, мне придется поддерживать столько конфигураций, сколько у меня есть серверов.
Итак, главные вопросы таковы:
Есть ли в WCF какой-либо способ указать net.tcp
конечную точку (или https) службы WCF, размещенной на IIS, без указания для нее абсолютного URL-адреса?
Ответ №1:
Вы должны иметь возможность определять базовый адрес для своих net.tcp
конечных точек службы:
<service name="YourServiceName">
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:808/psh_pub/" />
</baseAddresses>
</host>
Тогда вы сможете использовать относительные адреса в своих реальных конечных точках:
<endpoint name="Tcp01"
address="pshservice.svc"
binding="netTcpBinding"
contract="wcf_service_auth.IPshService" />
</service>
Комментарии:
1. я не знаю, что я только что сделал, но у меня есть рабочая конечная точка net.tcp с пустым параметром «address». в любом случае спасибо за помощь.
Ответ №2:
Активация WCF без файлов (.Net 4.0) позволит вам зарегистрироваться по относительному виртуальному пути, используя атрибут relativeAddress:
<system.serviceModel>
<serviceHostingEnvironment>
<serviceActivations>
<add relativeAddress="relative-virtual-path/yourservice.svc"
service="YourServiceImpl" />
</serviceActivations>
</serviceHostingEnvironment>
</system.serviceModel>
относительно базового адреса веб-приложения
Эта ссылка рассказывает об этом: http://msdn.microsoft.com/en-us/library/ee354381.aspx
Комментарии:
1. активация без файлов позволяет мне избавиться от файла .svc, но я не вижу, как это может помочь избежать указания абсолютного адреса хоста для конечной точки net.tcp. Я что-то пропустил?
2. @pushist1y В разделе активации служб есть атрибут relativeAddress, который позволяет вам указать относительный виртуальный путь для доступа к вашей службе. Это не работает для вас?