无效的操作异常

时间:2009-11-01 21:45:57

标签: c# .net wcf

我创建了一个在IIS上托管时运行良好的WCF Serice。

现在,我使用相同的服务,并在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.

2 个答案:

答案 0 :(得分:22)

错误很明显 - 您正在使用HTTP,您已在ServiceMetadata行为上启用了HttpGetEnabled,但您尚未在配置中提供基址。

在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,可以从中获取元数据。

或者,如果你不喜欢这个,那么你的备选方案的错误信息非常清楚:在你的ServiceMetadata中定义HttpGetUrl的绝对URL:

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

客户端可以从“mex”端点获取元数据,或者在第二个示例中定义的固定URL,或者它们将转到服务的基地址以获取元数据(如果有的话)。< / p>

如果您来自IIS并且没有进行任何调整,那么您的元数据交换端点既没有基本地址,也没有明确的绝对URL,这就是您遇到错误的原因。

马克

答案 1 :(得分:0)

当我尝试使用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>