относительный адрес конечной точки wcf

#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, который позволяет вам указать относительный виртуальный путь для доступа к вашей службе. Это не работает для вас?