3

我们在 Windows Server 2003 上托管 WCF Web 服务。该服务器只有 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>
4

3 回答 3

7

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 文章也有评论,提供了增强的变体:

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


如果服务不工作...

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

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

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

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

接下来,尝试从 Web 浏览器测试 ASMX 和 WCF 服务,无论是在服务器本地,还是在其他桌面内部,最后是外部。

测试网址

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

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

  • http:// localhost /WcfService1/Service1。服务端
  • http:// localhost /WcfService1/Service1。asmx
  • http:// MachineName 或 MachineFQN /WcfService1/Service1。服务端
  • http:// MachineName 或 MachineFQN /WcfService1/Service1。asmx
  • http:// MachineLocalIP#1 /WcfService1/Service1。服务端
  • http:// MachineLocalIP#1 /WcfService1/Service1。asmx
  • http:// MachineLocalIP#2 /WcfService1/Service1。服务端
  • http:// MachineLocalIP#2 /WcfService1/Service1。asmx
  • http://外部IP/WcfService1/Service1。服务端
  • http://外部IP/WcfService1/Service1。asmx

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

检测服务方法

如果您愿意,请从 Web 浏览器开始并在 ASMX Web 服务上为任何经过测试的 URL 测试一些 Web 方法。您很快就会看到我们也可以用不同的方式测试 ASMX Web 服务......

接下来,我们将使用Visual Studio 2008 发行版 ( C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE ) 中的WcfTestClient.exe应用程序在 WCF 服务和 ASMX Web 服务上测试 Web 方法。

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

http://i.stack.imgur.com/mNK8l.jpg

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

结论

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

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

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

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

于 2009-02-20T12:13:39.123 回答
1

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

查看 配置 IIS 主机标头的步骤,以便 WCF 将在 WSDL 引用中使用域名。

于 2009-02-21T10:03:00.940 回答
1

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

是一篇讨论它的文章。

于 2009-02-24T13:34:22.593 回答