【问题标题】:404 BadRequest exposing WCF service through external IP using IIS host headers404 BadRequest 通过使用 IIS 主机标头的外部 IP 公开 WCF 服务
【发布时间】:2009-02-16 13:47:58
【问题描述】:

我们在 Windows Server 2003 上托管 WCF 网络服务。该服务器只有 2 个内部 IP。我们希望将服务暴露在外部。这是通过将外部 IP 映射到服务的防火墙完成的。

因此,我需要修改服务以显示内部链接的外部 IP。这不是问题,因为它只能在外部使用。

在 IIS 中更改主机标头值会从 IIS 得到“错误请求(无效主机名)”响应。我还在 web.config 中的端点条目中添加了一个“地址”值......但它仍然只是指向内部机器名称。有什么想法吗?

编辑:我可以验证 IIS7 具有完全相同的行为。地址无效。不同的主机名给出了无效的主机名错误。真的没有办法呈现不同的(虚构的)IP吗? :/

编辑2:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicAnonymous">
                <security mode="None"/>
            </binding>
        </basicHttpBinding>
    </bindings>
    <behaviors>
        <serviceBehaviors>
            <behavior name="Extended">
                <serviceMetadata httpGetEnabled="true"/>
                <dataContractSerializer maxItemsInObjectGraph="2147483646"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <diagnostics>
        <messageLogging logEntireMessage="true" logMalformedMessages="false" logMessagesAtServiceLevel="false" logMessagesAtTransportLevel="true" maxMessagesToLog="3000"/>
    </diagnostics>
    <services>
        <service behaviorConfiguration="Extended" name="AnCWCFWebService.ProductInfoProvider">
            <endpoint address="" binding="basicHttpBinding" name="ASMX" bindingConfiguration="BasicAnonymous" contract="AnCWCFWebService.Interfaces.IProductInfoProvider"/>
        </service>
    </services>
</system.serviceModel>

【问题讨论】:

  • 添加了一个我认为非常全面的全新答案。祝你好运!
  • 我现在有了解决方案。让我建议您将问题的标题更改为:404 BadRequest exposing WCF service through external IP using IIS host headers。

标签: wcf iis-6 networking wcf-binding


【解决方案1】:

404 BadRequest 由于 IIS 配置...

如果您在尝试修改 IIS 中的主机标头后从 IIS 收到 404 BadRequest 错误,这很常见,但有一个修复方法!

通过更改 IIS 配置来修复

WCF 如何支持为每个站点指定多个 IIS 绑定?:
http://tinyurl.com/55q5hg

通过修改 WCF 代码来修复

或者,下面的文章解释了一位开发人员如何结合配置和代码解决这个问题:

嗯,这很有趣! WCF、SSL 和主机标头的冒险
http://geekswithblogs.net/rakker/archive/2008/07/03/123562.aspx

文章引用了两个重要的链接...

第一个解释了如何在 IIS 中正确设置主机头:

让主机头工作后,你会发现......

"您不能拥有多个主机 IIS 或 wcf 的标头将中断”

在这篇文章中找到了解决这个限制的解决方案,上面的 GeeksWithBlogs.net 文章中也有评论提供了一个增强的变体:

如果您仍然遇到问题,请在下面的 cmets 中告诉我们...


如果服务不工作...

我使用 WCF 的经验是,它有时非常棘手,尤其是在配置方面。如果一个人遵循最佳实践并且没有做任何非标准的事情,那么绝大多数部署问题都是由于配置文件错误造成的。

理论上(实际上并没有那么多,由于架构差异),在 IIS 上设置 WCF 服务应该与为 Web 应用程序或 ASMX Web 服务设置一个典型的虚拟目录和相应的应用程序没有什么不同。

因此,我建议如果这是您向 Internet 公开的第一个 WCF 服务,请遵循公开您的第一个网站时所采用的相同简单方法。基本上,创建一个新的示例“WCF 服务应用程序”(在 C# 或 VB 的 Web 部分下的“添加新项目”对话框中可用)。

一旦你让它工作,按照你的部署实践将它移动到生产沙箱并在本地测试它。该沙箱最好已经安装了一些网站或 Web 服务,并且已知可以从 Internet 访问,以便消除对典型网络配置问题的任何疑问。如果您有一个示例 ASMX Web 服务已经从该服务器成功公开到 Internet,那将是最好的。

接下来,尝试从 Web 浏览器测试 ASMX 和 WCF 服务,包括在服务器本地、在其他桌面内部以及最后在外部测试。

测试网址

我们想测试从网络浏览器访问标准 SVC 和 ASMX 文件的各种可用和相关的 URL 风格。结果应该是相似的,在窗口中有关于服务渲染的摘要页面。不同之处在于,如果 web.config 文件中没有禁用该功能,则 ASMX Web 服务的摘要可能允许您在服务上执行 Web 方法。

比较浏览器获取以下样式 URL 的结果...

  • http://localhost/WcfService1/Service1.svc
  • http://localhost/WcfService1/Service1.asmx
  • http://MachineName 或 MachineFQN/WcfService1/Service1.svc
  • http://MachineName 或 MachineFQN/WcfService1/Service1.asmx
  • http://MachineLocalIP#1/WcfService1/Service1.svc
  • http://MachineLocalIP#1/WcfService1/Service1.asmx
  • http://MachineLocalIP#2/WcfService1/Service1.svc
  • http://MachineLocalIP#2/WcfService1/Service1.asmx
  • http://ExternalIP/WcfService1/Service1.svc
  • http://ExternalIP/WcfService1/Service1.asmx

所有这些测试都应该返回相似的结果。

测试服务方法

如果您愿意,请在 Web 浏览器中为任何测试的 URL 在 ASMX Web 服务上测试一些 Web 方法。您很快就会发现我们也可以用不同的方式测试 ASMX Web 服务...

接下来,我们将使用 Visual Studio 2008 发行版中的 WcfTestClient.exe 应用程序(C:\程序文件\Microsoft Visual Studio 9.0\Common7\IDE)。

您需要通过文件->添加服务菜单项添加服务,为您希望测试的每个服务 URL 输入上面的 URL。确保包含 SVC 和 ASMX 文件的文件名。如果一切顺利,由 web.config 文件中 &lt;serviceMetadata/&gt; 元素的“httpGetEnabled”属性启用的 MEX 端点将返回实用程序运行所需的数据,从而使用我们的服务方法是这样的:

从这一点来看,参考以下资源将很有用:

结论

如果您做到了这一点,那么我预计不会出现任何其他问题,您现在应该尝试将示例设置与您尝试发布到 Internet 的 WCF 服务进行比较,希望差异会是明显的。

请记住在诊断期间将 WCF 服务视为 ASMX Web 服务,假设已知 web.config 已正确设置。

如果您仍然无法正常工作,请查看本指南以获取更多技术建议:

最后,如果一切都失败了,只需将您的 WCF 服务包装在一个 ASMX Web 服务中:

【讨论】:

  • 第三次尝试是魅力,我相信。
  • 我还没有尝试过,但在我看来这就是问题所在。谢谢! :) 您为此付出了巨大的努力,哈哈 :D 下次我部署该服务时,我将使用该技巧。我知道 IIS 做错了什么......所以你有它。再次感谢!
  • 我很乐意提供帮助。我目前几乎完全开发 WCF 服务,因此我喜欢尽可能深入地了解所有 WCF 问题。干杯,我希望它有效。通过回答这个问题,我学到了很多东西。希望其他开发人员最终会在这个答案中找到价值。
【解决方案2】:

您只需要在 IIS 中配置主机标头,以便 WSDL 引用中的链接将使用域名而不是本地机器名称。

退房 Steps to configure IIS host header so that WCF will use domain name in WSDL references.

【讨论】:

    【解决方案3】:

    为什么不直接为服务器分配一个新的 IP 地址,而不是乱用主机名呢?一个 Windows Server 可以有多个 IP 地址用于同一个 NIC。

    Here 是一篇文章讲的。

    【讨论】:

    • 这不是一个选项。该服务必须在我们的网络内运行,并且应该在我们的网络外路由到 DMZ。这一切都非常安全和东西:/但是是的......这就是我们现在所做的,直到我们找到一个永久的解决方案。
    • 好的。我会接受你的话,但我不明白为什么。您可以在同一内部子网中分配额外的 IP 地址。
    猜你喜欢
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多