我使用的是VSTS 2008 + C#+ .NET 3.0。我正在使用自托管的WCF服务。执行以下语句时,会出现以下“未找到绑定”的情况。错误。我发布了我的整个app.config文件,任何想法有什么问题?

ServiceHost host = new ServiceHost(typeof(MyWCFService));

错误讯息:

  

无法找到与方案http匹配的基地址   绑定MetadataExchangeHttpBinding的端点。注册基地   地址方案是[https]。

完整的app.config:

<?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>
有帮助吗?

解决方案

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

如果您希望自己的服务使用https://,则还需要使用 mexHttpsBinding

<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>

马克

其他提示

我可以获得双倍分数吗? :)

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

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

我在 Marc_s answer

  

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

&NBSP; marc_s&NBSP;回答&NBSP;

  

你应该能够为http://和定义第二个基地址   将其用于http mex端点。

因此解决方案是使用SAME&nbsp; address =&quot; mex&quot;来声明多个端点。和不同的绑定,如下所示

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

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

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

  

可以使用&nbsp; ServiceHostFactory&nbsp;类来创建自定义   源自Internet信息服务中的ServiceHost   (IIS&nbsp;自定义ServiceHost,添加ServiceMetadataBehavior,(   启用元数据发布),即使此行为未明确表示   添加在服务的配置文件中。

     

&nbsp;编写一次启用元数据发布的命令性代码   然后在几个不同的服务中重用该代码。这是   通过创建一个源自&nbsp; ServiceHost&nbsp;和。的新类来完成   覆盖&gt; ApplyConfiguration()方法以强制添加   元数据发布行为。

来自自定义服务主机MSDN文章的示例代码

//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");
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top