我创建了一个在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.
答案 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>