6

我正在尝试使用 System.Net.HttpWebRequest 类对特定 Web 服务器执行 HTTP GET 请求,以实现我们在众多服务器上进行负载平衡的 Web 应用程序。为了实现这一点,我需要能够为请求设置 Host 标头值,并且我已经能够通过使用 System.Net.WebProxy 类来实现这一点。

但是,当我尝试使用 SSL 执行 GET 时,这一切都崩溃了。当我尝试执行此操作时,对 HttpWebRequest.GetResponse 的调用会引发 System.Net.WebException,HTTP 状态代码为 400(错误请求)。

我试图通过 HttpWebRequest 实现的目标是可能的,还是我应该寻找一种替代方法来执行我想要的?

这是我一直用来尝试让这一切正常工作的代码:-

using System;
using System.Web;
using System.Net;
using System.IO;

namespace UrlPollTest
{
    class Program
    {
        private static int suffix = 1;
        static void Main(string[] args)
        {
            PerformRequest("http://www.microsoft.com/en/us/default.aspx", "www.microsoft.com");
            PerformRequest("https://www.microsoft.com/en/us/default.aspx", "");
            PerformRequest("https://www.microsoft.com/en/us/default.aspx", "www.microsoft.com");

            Console.WriteLine("Press any key to continue");
            Console.ReadKey();
        }

        static void PerformRequest(string AUrl, string AProxy)
        {
            Console.WriteLine("Fetching from {0}", AUrl);
            try
            {
                HttpWebRequest request = WebRequest.Create(AUrl) as HttpWebRequest;
                if (AProxy != "")
                {
                    Console.WriteLine("Proxy = {0}", AProxy);
                    request.Proxy = new WebProxy(AProxy);
                }

                WebResponse response = request.GetResponse();
                using (Stream httpStream = response.GetResponseStream())
                {
                    using (StreamReader reader = new StreamReader(httpStream))
                    {
                        string s = reader.ReadToEnd();
                        File.WriteAllText(string.Format("D:\\Temp\\Response{0}.html", suffix++), s);
                    }
                }
                Console.WriteLine("  Success");
            }
            catch (Exception e)
            {
                Console.WriteLine("  " + e.Message);
            }
        }
    }
}
4

2 回答 2

2

我之前使用过一种 hacky 方法 - 使用一个测试 exe 来修改我的“主机”文件,将场名称的条目注入特定服务器的地址(并发出ipconfig /flushdns. 之后,请求应该被路由到正确的服务器,就好像它是那里唯一的服务器一样。

显然,这需要管理员访问权限......我将其用作自动烟雾测试的一部分,以打击农场,就好像它是单独的机器一样。

您可能会尝试的另一件事是 NLB 上的某些东西,也许在 TCL 中(在 F5 的情况下) - 也许添加一个 NLB 可以理解的自定义标头?(假设它正在进行 SSL 重新签名)。

于 2009-08-06T04:24:39.847 回答
0

在 .NET 4.0 中,Host 标头可以独立于请求的 URL 进行设置,因此我建议您使用 HttpwebRequest.Host 来解决您的问题。这(我认为)将作为 .NET 4.0 beta2 的一部分发布。如果不实现您自己的 WebRequest 自定义子类(相信我,已经尝试过),就无法在以前版本的 .Net 下将主机标头重写为不同的。

于 2009-09-09T00:53:56.117 回答