Недопустимое исключение операции

Я создал серию WCF, которая отлично работала при размещении в IIS.

теперь я взял ту же службу и создал приложение-хост в WPF, и при попытке запустить службу из этого приложения я получаю это исключение:

The HttpGetEnabled property of ServiceMetadataBehavior is set to true and the   
HttpGetUrl property is a relative address, but there is no http base address.  
Either     supply an http base address or set HttpGetUrl to an absolute address.

Ответ 1

Ошибка довольно ясна - вы используете HTTP, вы включили HttpGetEnabled в свой сервис ServiceMetadata, но вы не указали базовый адрес в своей конфигурации.

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

Измените свою конфигурацию, чтобы выглядеть примерно так:

<system.serviceModel>
  <services>
    <service name="YourService">
      <host>
        <baseAddresses>
           <add baseAddress="http://localhost:8080/YourService" />
        </baseAddresses>
      </host>
      <endpoint address="mex" binding="mexHttpBinding"
                contract="IMetadataExchange" />
      ..... (your own other endpoints) ...........
    </service>
  </services>
</system.serviceModel>

Теперь "HttpGetEnabled" имеет базовый адрес http://localhost.8080/YourService, чтобы перейти от метаданных.

Или, если вам это не нравится, опять же, сообщение об ошибке достаточно ясно для вашей альтернативы: укажите абсолютный URL-адрес HttpGetUrl в вашем ServiceMetadata:

  <serviceBehaviors>
    <behavior name="Default">
      <serviceMetadata 
           httpGetEnabled="true" 
           httpGetUrl="http://localhost:8282/YourService/mex" />
    </behavior>
  </serviceBehaviors>

Клиенты могут получать ваши метаданные из конечных точек "mex" с фиксированным URL-адресом, определенным в этом втором примере, или они перейдут на базовый адрес службы для метаданных (если таковой имеется).

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

Марк

Ответ 2

Я столкнулся с этой ошибкой, когда попытался использовать привязку net.pipe. В моем случае поведение службы по умолчанию опубликовало метаданные службы. Это причина моей ошибки. Мое решение состоит в том, чтобы использовать разные методы для ваших услуг., то я изменил свой конфигурационный файл в соответствии с ответом @marc_s и произвел различные виды обслуживания следующим образом:

<serviceBehaviors>
        <!--Default behavior for all services (in my case net pipe binding)-->
        <behavior >

          <serviceMetadata   httpGetEnabled="false" httpsGetEnabled="false" />

          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
        <!--for my http services -->
        <behavior name="MyOtherServiceBehavior">

          <serviceMetadata   httpGetEnabled="true" httpsGetEnabled="true" />

          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>

Ответ 3

Убедитесь, что класс сервиса правильный.

Он решил мою проблему

// Create a ServiceHost for the CalculatorService type and 
// provide the base address.
serviceHost = new ServiceHost(typeof(ServiceClass));