带有 WCF 错误的 https:“找不到与方案 https 匹配的基地址”

Posted

技术标签:

【中文标题】带有 WCF 错误的 https:“找不到与方案 https 匹配的基地址”【英文标题】:https with WCF error: "Could not find base address that matches scheme https" 【发布时间】:2010-09-26 16:06:01 【问题描述】:

我去https://mywebsite/MyApp/Myservice.svc 得到以下错误:

(如果我使用 http:// 链接有效)

"服务'/MyApp/MyService.svc'由于编译过程中的异常而无法激活。异常消息是:找不到与绑定BasicHttpBinding的端点的方案https匹配的基地址。已注册基地址方案是 [http].."

编辑:因此,如果我将 address="" 更改为 address="https:// ...",则会收到此错误:

错误:不支持协议“https”......“https://.../Annotation.svc”的 ChannelDispatcher 与合同“注释”无法打开其 IChannelListener。"

这是我的Web.Config 的样子:

<services>
      <service behaviorConfiguration="AnnotationWCF.AnnotationBehavior"
              name="AnnotationWCF.Annotation">
              <endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_Annotation"
                      contract="AnnotationWCF.Annotation" />
              <endpoint address="" 
                  binding="basicHttpBinding" bindingConfiguration="SecureTransport"
                  contract="AnnotationWCF.Annotation" />
              <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>

<bindings>
<basicHttpBinding>
    <binding name="BasicHttpBinding_Annotation" maxBufferSize="2147483647"
            maxReceivedMessageSize="2147483647">
        <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
            maxArrayLength="2147483647" maxBytesPerRead="2147483647"
            maxNameTableCharCount="2147483647" />
    </binding>
    <binding name="SecureTransport" maxBufferSize="2147483647"
            maxReceivedMessageSize="2147483647">
        <security mode="Transport">
        <transport clientCredentialType="None"/>
        </security>
        <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
            maxArrayLength="2147483647" maxBytesPerRead="2147483647"
            maxNameTableCharCount="2147483647" />
    </binding>
</basicHttpBinding>

【问题讨论】:

【参考方案1】:

我遇到了同样的问题。除了我的解决方案是在绑定值中添加一个“s”。

旧: 绑定="mexHttpBinding"

新功能: 绑定="mexHttpsBinding"

web.config sn-p:

<services>
    <service behaviorConfiguration="ServiceBehavior" name="LIMS.UI.Web.WCFServices.Accessioning.QuickDataEntryService">
        <endpoint behaviorConfiguration="AspNetAjaxBehavior" binding="webHttpBinding" bindingConfiguration="webBinding" 
            contract="LIMS.UI.Web.WCFServices.Accessioning.QuickDataEntryService" />
        <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
    </service>

【讨论】:

【参考方案2】:

原来我的问题是我使用负载平衡器来处理 SSL,然后通过 http 将它发送到实际服务器,然后它抱怨。

修复说明在这里:http://blog.hackedbrain.com/2006/09/26/how-to-ssl-passthrough-with-wcf-or-transportwithmessagecredential-over-plain-http/

编辑:在与微软支持人员交谈后,我解决了我的问题,但略有不同。

我的 silverlight 应用程序在代码中的端点地址通过 https 传输到负载均衡器。然后负载均衡器将端点地址更改为 http 并指向它要访问的实际服务器。因此,在每个服务器的 Web 配置中,我为端点添加了一个 listenUri,它是 http 而不是 https

<endpoint address="" listenUri="http://[LOAD_BALANCER_ADDRESS]" ... />

【讨论】:

链接 -> blog.hackedbrain.com/archive/2006/09/26/5281.aspx 无效。 使用链接-> blog.hackedbrain.com/2006/09/26/…【参考方案3】:

确保为您的服务器启用 SSL!

尝试在没有该证书的本地机器上使用 HTTPS 配置文件时出现此错误。我试图进行本地测试 - 通过将一些绑定从 HTTPS 转换为 HTTP。我认为这样做比尝试安装自签名证书进行本地测试更容易。

原来我收到此错误是因为 我没有在本地 IIS 上启用 SSL,即使我并不打算实际使用它。

HTTPS 配置中有问题。在 IIS7 中创建自签名证书允许 HTTP 工作:-)

【讨论】:

我发现确保 IIS (6.0) 正在侦听端口 443 就足够了(右键单击默认网站、属性、SSL 端口、重新启动)。我还没有创建证书。 我发现@rory-macleod 的上述评论非常有帮助。在本地运行时,请确保通过右键单击 Visual Studio 中的项目来启用 SSL,然后在“项目属性”面板中将“启用 SSL”设置为“真”。然后,系统会提示您安装自签名证书。 @Jeff 谢谢就是这样!几天来我一直试图让它工作【参考方案4】:

我认为您正在尝试以与以下配置类似的方式配置您的服务。这里有更多信息:Specify a Service with Two Endpoints Using Different Binding Values。此外,除了开发之外,将 HTTP 和 HTTPS 端点都用于同一服务可能不是一个好主意。它有点违背了 HTTPS 的目的。希望这会有所帮助!

<service type="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
    <endpoint
        address="http://computer:8080/Hello"
        contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
        binding="basicHttpBinding"
        bindingConfiguration="shortTimeout"
    </endpoint>
    <endpoint
        address="http://computer:8080/Hello"
        contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
        binding="basicHttpBinding"
        bindingConfiguration="Secure"
     </endpoint>
</service>
<bindings>
    <basicHttpBinding 
        name="shortTimeout"
        timeout="00:00:00:01" 
     />
     <basicHttpBinding 
        name="Secure">
        <Security mode="Transport" />
     </basicHttpBinding>
</bindings>

【讨论】:

这看起来像是 MSDN 中的错字。在 Security mode="Transport" 之后不应该关闭第二个 basicHttpBinding 吗?有趣的是,安全地址以 http 开头,而不是 https。【参考方案5】:

在我的情况下,我在绑定中将安全模式设置为“TransportCredentialOnly”而不是“Transport”。更改它解决了问题

<bindings>
  <webHttpBinding>
    <binding name="webHttpSecure">
      <security mode="Transport">
        <transport clientCredentialType="Windows" ></transport>
      </security>
      </binding>
  </webHttpBinding>
</bindings>

【讨论】:

【参考方案6】:

我正在使用 webHttpBinding 并且忘记在导致错误的绑定配置上指明“传输”的安全模式:

  <webHttpBinding>
    <binding name="MyWCFServiceEndpoint">
      <security mode="Transport" />
    </binding>
  </webHttpBinding>

在配置中添加这个可以解决问题。

【讨论】:

【参考方案7】:

查看您的基地址和端点地址(在您的示例代码中看不到)。很可能你错过了一个专栏或其他一些错字,例如https:// 而不是 https://

【讨论】:

以上是关于带有 WCF 错误的 https:“找不到与方案 https 匹配的基地址”的主要内容,如果未能解决你的问题,请参考以下文章

WCF 自托管命令行返回 503 错误

带有 CustomBinding 的 WCF 服务配置 HTTPS

带有 WCF 调用的 Ajax 返回 404 错误

带有消息的零星 WCF 服务激活错误 - 访问 IIS 元数据库时发生错误

为 http 和 https 端点配置带有路由 (global.asax) 的 WCF 4

带有 Windows 服务的 WCF 服务