Конечные точки службы WCF против базового адреса хоста - PullRequest
25 голосов
/ 04 августа 2011

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

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

    <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>

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

Ответы [ 3 ]

34 голосов
/ 04 августа 2011

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

19 голосов
/ 09 января 2013

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

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

Предположим, у вас есть файл с именем calc.svc, и вы поместите его в виртуальный каталог, соответствующий 'http://localhost:8080/calcservice'. Базовый адрес для этой службы будетbe '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://localhost:8080/calcservice/calc.svc'), поскольку я оставил адрес конечной точки пустым. Адрес второй конечной точки становится комбинацией базового адреса с добавлением «secure», например:'http://localhost:8080/calcservice/calc.svc/secure'. А адрес конечной точки "mex" -' http://localhost:8080/calcservice/calc.svc/mex'. Некоторым людям это может показаться немного странным, поскольку относительная часть адреса добавляется справа от имени файла, но вы должны помнить, чтоcalc.svc является частью базового адреса, поэтому он должен работать следующим образом.

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

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

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

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

6 голосов
/ 04 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...