如何在 WCF 中修复“找不到与架构 http 匹配的基地址”...

Posted

技术标签:

【中文标题】如何在 WCF 中修复“找不到与架构 http 匹配的基地址”...【英文标题】:How to fix "could not find a base address that matches schema http"... in WCF 【发布时间】:2009-05-16 10:34:25 【问题描述】:

我正在尝试将 WCF 服务部署到我的服务器,托管在 IIS 中。自然它可以在我的机器上运行:)

但是当我部署它时,我收到以下错误:

此集合已包含一个 带有方案 http 的地址。有可以 每个方案最多有一个地址 这个集合。

谷歌搜索,我发现我必须将一个 serviceHostingEnvironment 元素放入 web.config 文件中:

<serviceHostingEnvironment>
  <baseAddressPrefixFilters>
    <add prefix="http://mywebsiteurl"/>
  </baseAddressPrefixFilters>
</serviceHostingEnvironment>

但是一旦我这样做了,我会得到以下信息:

找不到一个基地址 匹配端点的方案 http 与绑定 BasicHttpBinding。 注册的基地址方案是 [https]。

它似乎不知道基地址是什么,但是我该如何指定呢?这是我的 web.config 文件的相关部分:

<system.serviceModel>
  <serviceHostingEnvironment>
    <baseAddressPrefixFilters>
      <add prefix="http://mywebsiteurl"/>
    </baseAddressPrefixFilters>
  </serviceHostingEnvironment>

  <behaviors>
    <serviceBehaviors>
      <behavior name="WcfPortalBehavior">
        <serviceMetadata httpGetEnabled="true"/>
        <serviceDebug includeExceptionDetailInFaults="true"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <bindings>
    <basicHttpBinding>
      <binding name="BasicHttpBinding_IWcfPortal"
               maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"
               receiveTimeout="00:10:00" sendTimeout="00:10:00"
               openTimeout="00:10:00" closeTimeout="00:10:00">
        <readerQuotas maxBytesPerRead="2147483647" maxArrayLength="2147483647"
               maxStringContentLength="2147483647"/>
      </binding>
    </basicHttpBinding>
  </bindings>

  <services>
    <service behaviorConfiguration="WcfPortalBehavior" name="Csla.Server.Hosts.Silverlight.WcfPortal">
      <endpoint address="" binding="basicHttpBinding" contract="Csla.Server.Hosts.Silverlight.IWcfPortal"
      bindingConfiguration="BasicHttpBinding_IWcfPortal">
      </endpoint>
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    </service>
  </services>
</system.serviceModel>

任何人都可以阐明发生了什么以及如何解决它吗?

【问题讨论】:

嘿克雷格,你解决了这个问题吗?请让我......我现在面临同样的问题:( 有什么最终解决方案吗? 【参考方案1】:

尝试将安全模式从“传输”更改为“无”。

      <!-- Transport security mode requires IIS to have a
           certificate configured for SSL. See readme for
           more information on how to set this up. -->
      <security mode="None">

【讨论】:

非常好 - 我将端点从 https 更改为 http 仅用于本地调试,忘记将安全模式 =“传输”更改为安全模式 =“无”。固定。【参考方案2】:

我必须对站点/应用程序的 IIS 配置做两件事。我的问题与让 net.tcp 在 IIS 网站应用程序中工作有关:

第一:

    右键单击 IIS 应用程序名称。 管理网站 高级设置 将启用的协议设置为“http,net.tcp”

第二:

    在 Manager 右侧的 Actions 菜单下,单击 Bindings... 点击添加 将类型更改为“net.tcp” 将绑定信息设置为open port number:* 好的

【讨论】:

【参考方案3】:

您的 IIS 是否配置为在连接到您的站点/应用程序时需要 SSL?

【讨论】:

我遇到了同样的错误,@tomasr 和 IIS 配置为需要 SSL。这会是一个问题吗?有没有办法解决这个问题?【参考方案4】:

如果你想在 web.config 中使用 baseAddressPrefixFilters,你也必须设置 IIS (6)。这对我有帮助:

1/ 在 IIS 中找到您的站点。 2/属性/网站(选项卡)/IP地址->高级按钮 3/ 在您将在 web.config 中使用的同一端口上添加新的主机头。

【讨论】:

【参考方案5】:

只有列表中的第一个基地址会被接管(来自 IIS)。 在 .NET4 之前,每个方案不能有多个基地址。

【讨论】:

【参考方案6】:

解决方案是在 Web.Config 文件中定义自定义绑定并将安全模式设置为“传输”。然后,您只需要使用端点定义中的 bindingConfiguration 属性来指向您的自定义绑定。

请看这里:Scott's Blog: WCF Bindings Needed For HTTPS

【讨论】:

【参考方案7】:

如果托管在 IIS 中,则无需指定基地址,它将是虚拟目录的地址。

【讨论】:

【参考方案8】:

应该有一种方法可以通过外部配置部分和额外的部署步骤轻松解决此问题,该步骤将特定于部署的外部 .config 文件放入已知位置。我们通常使用此解决方案来处理我们不同部署环境(暂存、QA、生产等)的不同服务器配置,如果没有发生特殊副本,我们的“开发箱”是默认设置。

【讨论】:

【参考方案9】:

确认我的修复:

在您的 web.config 文件中,您应该将其配置为如下所示:

<system.serviceModel >
    <serviceHostingEnvironment configSource=".\Configurations\ServiceHosting.config" />
    ...

然后,构建一个如下所示的文件夹结构:

/web.config
/Configurations/ServiceHosting.config
/Configurations/Deploy/ServiceHosting.config

基本的 serviceHosting.config 应该如下所示:

<?xml version="1.0"?>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
    <baseAddressPrefixFilters>
    </baseAddressPrefixFilters>
</serviceHostingEnvironment>

而 /Deploy 中的那个看起来像这样:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
    <baseAddressPrefixFilters>
        <add prefix="http://myappname.web707.discountasp.net"/>
    </baseAddressPrefixFilters>
</serviceHostingEnvironment>

除此之外,您还需要添加手动或自动部署步骤,以将 /Deploy 中的文件复制到 /Configurations 中的文件之上。这对于服务地址和连接字符串非常有效,并且可以节省其他解决方法的工作量。

如果您不喜欢这种方法(这种方法可以很好地扩展到农场,但在单台机器上较弱),您可以考虑在主机机器上的服务部署上添加一个 web.config 文件并将 serviceHostingEnvironment那里的节点。它应该为您级联。

【讨论】:

以上是关于如何在 WCF 中修复“找不到与架构 http 匹配的基地址”...的主要内容,如果未能解决你的问题,请参考以下文章

如何修复错误 Endpoint not found WCF REST POST

如何通过 Jquery 调用 C# WCF 服务来修复“ERR_ABORTED 400 (Bad Request)”错误?

如何修复“客户端身份验证方案‘匿名’禁止 HTTP 请求”

如何修复“枚举约束失败”?

WCF 性能问题:请求停止处理

WCF REST 服务 400 错误请求