mexHttpBinding - 将 ServiceMetadataBehavior 添加到配置文件或直接添加到 ServiceHost 以启用对此协定的支持

Posted

技术标签:

【中文标题】mexHttpBinding - 将 ServiceMetadataBehavior 添加到配置文件或直接添加到 ServiceHost 以启用对此协定的支持【英文标题】:mexHttpBinding - Add a ServiceMetadataBehavior to the configuration file or to the ServiceHost directly to enable support for this contract 【发布时间】:2011-11-18 12:02:57 【问题描述】:

我知道这个问题已经被问过很多次,也回答过很多次,但是,所有提供的应该工作的示例今天似乎都不适合我。

当我尝试启动主机时,我不断收到以下错误:

“在服务 TraceService 实施的合同列表中找不到合同名称“IMetadataExchange”。将 ServiceMetadataBehavior 添加到配置文件或直接添加到 ServiceHost 以启用对此合同的支持。”

根据 Microsoft 的示例,我的服务托管在托管的 Windows 服务主机中:http://msdn.microsoft.com/en-us/library/ms733069%28v=vs.90%29.aspx

这是我漂亮而简单的配置:

  <system.serviceModel>
    <services>
      <service name="Daff.Lae.Service.TraceService">
        <endpoint address="" binding="wsHttpBinding" name="TraceService" contract="Contracts.Service.ITraceService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080/TraceService" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="DefaultBehavior">
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

当然,如果我删除这行没有错误,问题会变得更有趣:

<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>

任何帮助将不胜感激:)

【问题讨论】:

【参考方案1】:

请务必在您的配置的service 元素中指定behaviorConfiguration,以便允许httpGethttpsGet

我看到您已经定义了一个名为 DefaultBehavior 的 serviceBehavior - 现在您需要做的就是将 behaviorConfiguration="DefaultBehavior" 添加到 service 元素中,因此该行变为:

<service name="Daff.Lae.Service.TraceService" behaviorConfiguration="DefaultBehavior">

如果您没有为您的服务明确指定行为,则默认情况下 HTTP GET 和 HTTPS GET 都是不允许的,并且您的元数据不会被公开。

【讨论】:

@agAus - 是的,但您尚未指定您的服务将使用您的默认行为。您需要将 'behaviorConfiguration' 属性添加到配置中的 'service' 元素中,如我的回答所示。 为清晰起见编辑了我的答案。 谢谢。这已经解决了:)【参考方案2】:

当您使用 WS-Http 时,您将绑定到 HTTPS 协议,因此您需要使用正确的 MEX 绑定;

<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" /> 

并将基地址更改为 https。

或者(反过来)将您的 wsHttp 绑定转换为 basicHttp 绑定,然后一切都会开始为您工作。

【讨论】:

啊...我没有意识到 wsHttpBinding 意味着它是 https?我今天忙于发布产品,但肯定想试试这个并回复你。我已经为我的问题添加了书签,以便我可以相应地更新帖子。谢谢:)【参考方案3】:
`<services>
  <service  name="MyService.Service1" behaviorConfiguration="Service1" >

</services>
 `

 where MyService is the application name , Service1 is the default implementation class for IService1
 `
 <protocolMapping>
  //Remove any http or https bindings provided  
</protocolMapping>   
 `
It should help when you use WCF Application Project

【讨论】:

以上是关于mexHttpBinding - 将 ServiceMetadataBehavior 添加到配置文件或直接添加到 ServiceHost 以启用对此协定的支持的主要内容,如果未能解决你的问题,请参考以下文章

Caused by: org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named ‘demo1Servic

Caused by: org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named ‘demo1Servic

普歌-解决MySQL安装到start servic出现安装未响应或超时未安装成功

iptables规则备份和恢复firewall的9个zone关于zone的操作和关于servic

LRF-解决MySQL安装到start servic出现安装未响应或超时未安装成功

Azure 媒体服务记使用 Media Servic