относительный адрес конечной точки 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