Ошибка при доступе к серверу WCF, размещенному на локальном IIS: "Эта операция не поддерживается для относительного URI".

Я получаю сообщение об ошибке "Эта операция не поддерживается для относительного URI." При доступе к службе WCF из моего веб-браузера. Служба размещена на локальном IIS, и ее конфигурация следующая:

<system.serviceModel>
    <!-- change -->
    <bindings>
      <customBinding>
        <binding name="Wrabind" closeTimeout="00:05:00" openTimeout="00:05:00" sendTimeout="00:25:00">
          <textMessageEncoding/>
          <security authenticationMode="SecureConversation" includeTimestamp="true" messageSecurityVersion="WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10">
            <localClientSettings maxClockSkew="00:30:00" />
            <localServiceSettings maxClockSkew="00:30:00" />
            <secureConversationBootstrap messageSecurityVersion="WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10">
              <localClientSettings maxClockSkew="00:30:00" />
              <localServiceSettings maxClockSkew="00:30:00" />
            </secureConversationBootstrap>
          </security>
          <httpTransport maxBufferPoolSize="20000000" maxReceivedMessageSize="20000000" allowCookies="true" maxBufferSize="20000000" keepAliveEnabled="false" />
        </binding>
      </customBinding>
    </bindings>
<services>
      <service behaviorConfiguration="wrCoreService.Service1Behavior" name="wrCoreService.Service1">
        <endpoint address="http://localhost/service1.svc" binding="customBinding" bindingConfiguration="Wrabind" contract="wrCoreService.IService1" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="wrCoreService.Service1Behavior">
          <serviceThrottling
maxConcurrentCalls="200"
maxConcurrentSessions="200"
maxConcurrentInstances="200" />
          <!-- To avoid disclosing metadata information, set the value below to false before deployment -->
          <serviceMetadata httpGetEnabled="false" />
          <!-- change -->
          <!--<serviceCredentials>
            <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="wrCoreService.Authentication.DistributorValidator, wrCoreService"/>
            <serviceCertificate findValue="wrCoreService" storeLocation="LocalMachine" storeName="TrustedPeople" x509FindType="FindBySubjectName"/>
          </serviceCredentials>-->
          <!-- change -->
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="true" />

        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment>
      <baseAddressPrefixFilters>
        <add prefix="localhost/" />
      </baseAddressPrefixFilters>
    </serviceHostingEnvironment>
    <!--<standardEndpoints>
      <webHttpEndpoint>
        <standardEndpoint name="" helpEnabled="true"
          automaticFormatSelectionEnabled="true"/>
      </webHttpEndpoint>
    </standardEndpoints>-->

  </system.serviceModel>

4 ответа

Как объясняет ошибка, вы можете иметь только абсолютный URI, не относительный. попробуйте дать абсолютный URI вместо localhost/

<baseAddressPrefixFilters>
  <add prefix="localhost/" />
</baseAddressPrefixFilters>

baseAddressPrefixFilters не распознает "localhost", вместо этого используйте полное имя компьютера.

Вот источник.

Как сказал Абхинай, тебе нужно http:// в префиксе для того, чтобы это был полностью квалифицированный URI (который требует схемы). Так что я бы сказал, попробуйте:

http://localhost (без косой черты)

или же

http://127.0.0.1

или же

http://your-machine-name.domain.whatever

Также попробуйте включить номер порта (например, http://localhost:8080) если вы находитесь в нестандартном порту.

Наконец, ваш тег конечной точки может фактически требовать относительный путь для своего адреса (я видел это раньше), поэтому:

<service behaviorConfiguration="wrCoreService.Service1Behavior" name="wrCoreService.Service1">
    <endpoint address="service1.svc" binding="customBinding" bindingConfiguration="Wrabind" contract="wrCoreService.IService1" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>

Попробуй это,

<serviceHostingEnvironment><baseAddressPrefixFilters>
<add prefix="http://localhost/" />
</baseAddressPrefixFilters>
</serviceHostingEnvironment>

Другие вопросы по тегам