404 BadRequest使用IIS主机标头通过外部IP公开WCF服务

Spo*_*oBo 3 wcf networking iis-6 wcf-binding

我们在Windows Server 2003上托管WCF Web服务.该服务器只有2个内部IP.我们希望从外部公开服务.这是通过将外部IP映射到服务的防火墙完成的.

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

更改IIS中的主机标头值会从IIS发出"错误请求(无效主机名)"响应.我还在web.config中的端点条目中添加了一个"地址"值...但它只是指向内部机器名称.有任何想法吗?

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

EDIT2:

<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>
Run Code Online (Sandbox Code Playgroud)

Eno*_*pal 7

由于IIS配置导致404 BadRequest ...

如果您在尝试修改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服务,那将是最好的.

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

测试网址

我们希望测试从Web浏览器访问标准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浏览器开始,在ASMX Web服务上测试一些Web方法,以获取任何经过测试的URL.您很快就会看到我们可以用不同的方式测试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文件的文件名.如果一切正常,则由<serviceMetadata/>web.config文件中元素的"httpGetEnabled"属性启用的MEX端点将返回该实用程序运行所必需的数据,从而使用我们的服务方法清单填充树.像这样:

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

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

结论

如果你做到这一点,那么我不期望任何其他问题,你现在应该尝试将样本的设置与你试图发布到Internet的WCF服务进行比较,并希望差异是显而易见的.

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

如果仍然无法使其工作,请查看本指南以获取进一步的技术建议:

最后,如果所有其他方法都失败了,只需将您的WCF服务包装在ASMX Web服务中: