首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >WCF中的mex绑定错误

WCF中的mex绑定错误
EN

Stack Overflow用户
提问于 2009-06-22 08:54:58
回答 3查看 37.6K关注 0票数 16

我使用的是VSTS2008+ C# + .NET 3.0。我正在使用一个自托管的WCF服务。执行以下语句时,出现以下"binding not found“错误。我已经发布了我的整个app.config文件,有什么问题吗?

代码语言:javascript
复制
ServiceHost host = new ServiceHost(typeof(MyWCFService));

错误消息:

找不到与具有绑定MetadataExchangeHttpBinding的终结点的方案http匹配的基地址。注册的基址方案是https。

完整的app.config:

代码语言:javascript
复制
<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="MyBinding"
            closeTimeout="00:00:10"
            openTimeout="00:00:20"
            receiveTimeout="00:00:30"
            sendTimeout="00:00:40"
            bypassProxyOnLocal="false"
            transactionFlow="false"
            hostNameComparisonMode="WeakWildcard"
            maxReceivedMessageSize="100000000"
            messageEncoding="Mtom"
            proxyAddress="http://foo/bar"
            textEncoding="utf-16"
            useDefaultWebProxy="false">
          <reliableSession ordered="false"
               inactivityTimeout="00:02:00"
               enabled="true" />
          <security mode="Transport">
            <transport clientCredentialType="Digest"
               proxyCredentialType="None"
               realm="someRealm" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service name="MyWCFService"
                behaviorConfiguration="mexServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="https://localhost:9090/MyService"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="MyBinding" contract="IMyService"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="mexServiceBehavior">
          <serviceMetadata httpGetEnabled="True"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-06-22 08:57:46

您的服务的基地址定义为"HTTPS://“-但是您的mex地址是"HTTP”。

如果你想让你的服务使用https://,,你也需要使用mexHttpsBinding

代码语言:javascript
复制
<services>
    <service name="MyWCFService" behaviorConfiguration="mexServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="https://localhost:9090/MyService"/>
          </baseAddresses>
        </host>
        <endpoint address="" 
                binding="wsHttpBinding" 
                bindingConfiguration="MyBinding" 
                contract="IMyService" 
        />
        <endpoint address="mex" 
                binding="mexHttpsBinding" 
                contract="IMetadataExchange" 
        />
    </service>
</services>

Marc

票数 48
EN

Stack Overflow用户

发布于 2009-06-22 08:59:44

我能得到双分吗?:)

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

代码语言:javascript
复制
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
票数 14
EN

Stack Overflow用户

发布于 2012-12-18 03:50:17

我在Marc_s answer的评论栏里问了一个问题

http和https的IMetadataExchange是否可以同时作为单独的端点?

 marc_s answered 

//,您应该能够为

://定义第二个基地址,并将其用于http mex端点。

所以解决方案是用SAME address="mex“声明多个端点,并像下面这样不同的绑定

代码语言:javascript
复制
<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />  
<endpoint contract="IMetadataExchange" binding="mexHttpsBinding" address="mex"/>

最近,我发现使用一个配置开关在测试时启用MEX,在Live上禁用MEX会更容易。

来自http://msdn.microsoft.com/en-us/library/aa395224.aspx

可以使用.ServiceHostFactory类在互联网信息服务(IIS)中创建从ServiceHost派生的自定义ServiceHost,它添加了ServiceMetadataBehavior (支持元数据发布),即使此行为没有显式添加到服务的配置文件中。

我只需编写一次启用元数据发布的命令式代码,然后在几个不同的服务中重用该代码。这是通过创建一个从ServiceHost派生的新类来实现的,该类覆盖了ApplyConfiguration()方法,以强制添加元数据发布行为。

来自Custom Service Host MSDN article的示例代码

代码语言:javascript
复制
//Add a metadata endpoint at each base address
//using the "/mex" addressing convention
foreach (Uri baseAddress in this.BaseAddresses)
{
    if (baseAddress.Scheme == Uri.UriSchemeHttp)
    {
        mexBehavior.HttpGetEnabled = true;
        this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
                                MetadataExchangeBindings.CreateMexHttpBinding(),
                                "mex");
    }
    else if (baseAddress.Scheme == Uri.UriSchemeHttps)
    {
        mexBehavior.HttpsGetEnabled = true;
        this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
                                MetadataExchangeBindings.CreateMexHttpsBinding(),
                                "mex");
    }
    else if (baseAddress.Scheme == Uri.UriSchemeNetPipe)
    {
        this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
                                MetadataExchangeBindings.CreateMexNamedPipeBinding(),
                                "mex");
    }
    else if (baseAddress.Scheme == Uri.UriSchemeNetTcp)
    {
        this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
                                MetadataExchangeBindings.CreateMexTcpBinding(),
                                "mex");
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1026149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档