2011-08-04 3 views
23

, поэтому я лишен путаницы над тем, для чего предназначены конечные точки службы и базовый адрес хоста. Во всех примерах, которые я прошел до сих пор, они говорят о настройке конечных точек с необходимыми привязками, и вы можете обычно перемещаться к этим конечным точкамКонечные точки WCF-службы по отношению к базовому адресу хоста

Hoever, когда я использую следующую конфигурацию для настройки и размещения моего сервиса, это только кажется чтобы открыть базовый адрес Hosts.

<configuration> 
     <system.web> 
     <compilation debug="true" /> 
     </system.web> 
     <!-- When deploying the service library project, the content of the config file must be added to the host's 
     app.config file. System.Configuration does not support config files for libraries. --> 
     <system.serviceModel> 
     <services> 
      <service name="HostService.EvalService"> 
      <endpoint address="http://localhost:8080/basic" 
       binding="basicHttpBinding" contract="HostService.IEvalService" /> 
      <endpoint address="http://localhost:8080/ws" 
       binding="wsHttpBinding" contract="HostService.IEvalService" /> 
      <endpoint address="mex" binding="mexHttpBinding" 
       name="mex" contract="IMetadataExchange" /> 
      <host> 
       <baseAddresses> 
       <add baseAddress="http://localhost:8080/EvalsService" /> 
       </baseAddresses> 
      </host> 
      </service> 
     </services> 
     <behaviors> 
      <serviceBehaviors> 
      <behavior name=""> 
       <serviceMetadata httpGetEnabled="true" /> 
       <serviceDebug includeExceptionDetailInFaults="false" /> 
      </behavior> 
      </serviceBehaviors> 
     </behaviors> 
     </system.serviceModel> 
    </configuration> 

Может кто-нибудь объяснить это мне?

ответ

32

Когда вы размещаете службу WCF в IIS, базовый адрес может быть только URL-адресом файла .svc. Если вы укажете любой другой базовый адрес, он будет проигнорирован. Вы все же можете указать относительный URI для своих конечных точек, например address="basic" или address = "ws". Тогда адрес на конечной точке в этом случае будет <URL to the .svc file>/basic и <URL to the .svc file>/ws.

+0

Должен ли я по-прежнему перемещаться к конечным точкам? на данный момент я не могу –

+4

Вы не сможете перейти к конечным точкам в браузере, но конечные точки все еще активны, и клиент должен иметь возможность подключиться просто отлично. –

+12

У меня нет ни малейшего понятия, почему MS не заявляет некоторые из ваших пуль в своей документации freakin. – PositiveGuy

6

При использовании базового адреса вам не нужно предоставлять абсолютный URI для ваших конечных точек, например, вы можете использовать address="basic" в разделе конфигурации конечной точки, это означает, что адрес для этой конечной точки - http://localhost:8080/EvalsService/basic.

+0

Можно ли установить относительный адрес конечной точки через код? – FrenkyB

15

Когда вы оставляете адрес конечной точки пустым, это означает, что конечная точка будет просто использовать соответствующий базовый адрес для своего адреса конечной точки. В качестве альтернативы вы можете настроить базовый адрес как абсолютный путь своей службы или как лучший подход, написать относительные адреса для ваших конечных точек.

Когда вы размещаете свои службы в IIS, базовый адрес службы определяется виртуальным каталогом IIS вместе с файлом .svc.

Предположим, у вас есть файл с именем calc.svc, и вы поместите его в виртуальный каталог, соответствующий «http: // localhost: 8080/calcservice». Базовый адрес для этой службы будет «http: // localhost: 8080/calcservice/calc.svc».

IIS заставляет конечные точки использовать этот базовый адрес, определенный в соответствии с вашим путем развертывания службы. Если вы укажете другой базовый адрес, а затем соответствующий виртуальный каталог, вы получите исключение.

Рассмотрите приведенную ниже конфигурацию;

<configuration> 
    <system.serviceModel> 
     <services> 
      <service name="CalculatorService"> 
       <!-- base address determined by IIS virtual directory --> 
       <endpoint binding="basicHttpBinding" contract="ISimpleMath"/> 
       <endpoint address="secure" binding="wsHttpBinding" contract="ISimpleMath"/> 
       <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
      </service> 
     ... 

... адрес первой конечной точки становится таким же, как базовый адрес ('HTTP: // локальный: 8080/calcservice/calc.svc'), так как я оставил адрес конечной точки пустым. Адрес второй конечной точки становится комбинацией базового адреса, добавленного с «безопасным», например: http: // localhost: 8080/calcservice/calc.svc/secure. И адрес конечной точки «mex» - «http: // localhost: 8080/calcservice/calc.svc/mex». Это может показаться немного странным для некоторых людей, поскольку относительная часть адреса добавляется справа от имени файла, но вы должны помнить, что calc.svc является частью базового адреса, поэтому он должен работать таким образом.

Хотя вы не можете перемещаться к «../mex» или «../secure» URL-адрес через браузер, они на самом деле являются активными и клиенты могут потреблять эти адреса.

поведение клиента

Клиенты не имеют понимания базового адреса службы и нет необходимости поддерживать что-то похожее на их стороне провода. В результате вы не найдете ничего, что связано с базовыми адресами в клиентской стороне объекта или в разделе конфигурации. Клиенты просто выбирают конкретную конечную точку, которая всегда поставляется с абсолютным адресом, а абсолютный адрес определяет адрес, который он будет использовать во время передачи.

Выше информации в основном извлечены из превосходного Aaron Skonnard article на msdn. Я настоятельно рекомендую вам прочитать его, чтобы получить основы для адресации WCF.

Смежные вопросы