使用HttpWebRequest访问的IP与域名解析出的不同

3
简而言之,我调用的API在不同的环境(开发/预发布/用户验收/生产)中设置了主机记录,以便将实时域解析为其他服务器并进行HTTP请求。
问题是,他们已经用这么多不同的环境来做了,我们没有足够的服务器来使用服务器范围内的主机文件(我们有一些环境在同一台服务器上运行 - 幸运的是除了开发和生产:P)。
我想知道是否有一种方法可以使WebRequest请求一个域,但明确指定它应连接到的服务器的IP?或者有没有其他方法可以做到这一点,而不需要一直降到套接字连接(我真的不想浪费时间/创建错误,试图重新实现HTTP协议)。
PS:我已经尝试过,但我们不能为每个环境获取新的子域。

为什么你不能在请求中直接指定IP地址? - Ragesh
你尝试过在Uri中使用IP地址,然后设置Host头吗? - Foole
Ragesh,只有在Host头正确的情况下服务器才会回答(他们的Web服务器专门监听那个域名,而该域名无法解析),因此如果我只使用IP地址,它不会正确响应。Foole,我尝试过了,但HttpWebRequest上的主机头不允许您设置它(也就是说request.Headers["Host"] = "www.example.com"会抛出异常)。 - fyjham
如果您需要,我可以发布一个自定义HTTP请求函数的代码。 - Foole
你是从套接字层面开始说起吗?我真的不想维护一个自定义的HTTP请求函数(我对HTTP有足够的了解,但规范非常庞大,未来的功能如HTTPS以及HTTP规范的所有边缘情况,例如重定向等都可能非常烦人和耗时)... - fyjham
这是一个非常老的问题,但是相关问题的这个答案解决了我的问题。 - Eyeball
2个回答

1

伪造HTTP Host头的一种方法是将代理设置为您希望发送请求的实际服务器。类似这样:

request.Proxy = new WebProxy(string.Format("http://{0}/", hostAddress));

可能会起作用。


谢谢...这是很久以前的事情了,我忘记了我们最终采用的实际解决方法,但我相信这实际上就是我们的做法。我认为webproxy需要一个IP:端口而不是http协议。我会标记这个答案,以便其他人可以找到它(当我最初找到解决方案时,我忘记发布答案了)。 - fyjham
没关系。我是在闲逛的时候发现这个问题的...;-) - Jeremy McGee

0

有多种方法可以控制配置值。

  1. 在.NET中启用条件编译,您可以创建自己的配置集并创建指令,可以使用特定域而不是更改其解析策略。例如,在调试中,您可以使用x.com,在发布模式下,您可以使用y.com,在需要引用您的url的任何地方。
  2. Web.config和app.config现在支持根据所选配置进行更改,您可以拥有web.debug.config和web.release.config,并在此处指定不同的url引用。

你似乎完全误解了问题,更改配置不会有任何帮助,因为两个 Web 服务器都期望从它们请求的 HOST 标头相同,但它只解析为其中一个。所以这不是 x.com 和 y.com,它们都是 x.com。 - fyjham
我知道,但是当我们根据需要配置不同的主机头部署不同的Web服务器时,无论如何,我认为Jeremy的答案适合你,这很好。 - Akash Kava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接