относительный адрес конечной точки 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. Добавляю в config:
<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
. Но это не так. И каждый "how - to" и руководство по web говорит, что я должен указать полный адрес в файле конфигурации следующим образом:
<endpoint address="net.tcp://localhost:808/psh_pub/pshservice.svc"
binding="netTcpBinding"
contract="wcf_service_auth.IPshService" />
и если я это сделаю, это сработает. Но если разместить службу в другом виртуальном каталоге, мне нужно будет изменить конфигурацию. Если я размещу его на другом сервере, мне нужно будет изменить конфигурацию. Если я размещу его на нескольких серверах, мне придется поддерживать столько конфигураций, сколько у меня есть.
Итак, основные вопросы:
есть ли способ в WCF указать net.tcp
(или https) конечная точка службы WCF, размещенной в IIS, без указания для нее абсолютного url-адреса?
2 ответов
вы должны быть в состоянии определить базовый адрес для 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>
активация без файлов 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