11

Web サイトに配信される Web ページのリクエストを作成する必要がありますが、ホスト ヘッダー情報も設定できる必要があります。HttpWebRequest を使用してこれを試しましたが、ヘッダー情報は読み取り専用です (または、少なくともホスト部分は読み取り専用です)。ユーザーができる前にページの最初のリクエストを実行したいので、これを行う必要があります。負荷分散された 10 個の Web サーバーがあるため、各 Web サーバーからファイルを要求する必要があります。

私は次のことを試しました:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://192.168.1.5/filename.htm");
request.Headers.Set("Host", "www.mywebsite.com");
WebResponse response = request.GetResponse();

ヘッダーを更新できないため、明らかにこれは機能しません。また、これが本当に正しい方法であるかどうかもわかりません。

4

9 に答える 9

11

これは非常に遅い答えですが、おそらく誰かがそれの恩恵を受けることができます

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri("http://192.168.1.1"));
request.Headers.GetType().InvokeMember("ChangeInternal", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, null, request.Headers, new object[] {"Host","www.mysite.com"});

リフレクションはあなたの友達です:)

于 2011-09-26T19:33:06.187 に答える
9

ソケットを使って、もっと長い曲がりくねったルートを見つけることができました。IPEndPointのMSDNページで答えを見つけました。

string getString = "GET /path/mypage.htm HTTP/1.1\r\nHost: www.mysite.mobi\r\nConnection: Close\r\n\r\n";
Encoding ASCII = Encoding.ASCII;
Byte[] byteGetString = ASCII.GetBytes(getString);
Byte[] receiveByte = new Byte[256];
Socket socket = null;
String strPage = null;
try
{
    IPEndPoint ip = new IPEndPoint(IPAddress.Parse("10.23.1.93"), 80);
    socket = new Socket(ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
    socket.Connect(ip);
}
catch (SocketException ex)
{
    Console.WriteLine("Source:" + ex.Source);
    Console.WriteLine("Message:" + ex.Message);
}
socket.Send(byteGetString, byteGetString.Length, 0);
Int32 bytes = socket.Receive(receiveByte, receiveByte.Length, 0);
strPage = strPage + ASCII.GetString(receiveByte, 0, bytes);

while (bytes > 0)
{
    bytes = socket.Receive(receiveByte, receiveByte.Length, 0);
    strPage = strPage + ASCII.GetString(receiveByte, 0, bytes);
}
socket.Close();
于 2008-12-11T13:18:19.670 に答える
4

使用した URL DNS に複数の異なる IP アドレスが含まれているという問題がありました。ホストで同じ DNS 名を使用して各アドレスを個別に呼び出したいと考えていました。解決策はプロキシを使用することです。

string retVal = "";
            // Can't change the 'Host' header property because .NET protects it
            // HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            // request.Headers.Set(HttpRequestHeader.Host, DEPLOYER_HOST);
            // so we must use a workaround
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Proxy = new WebProxy(ip);
            using (WebResponse response = request.GetResponse())
            {
                using (TextReader reader = new StreamReader(response.GetResponseStream()))
                {
                    string line;
                    while ((line = reader.ReadLine()) != null)
                        retVal += line;
                }
            }
            return retVal;

ホスト ヘッダーは「url」から .NET によって自動的に設定され、「ip」には接続する Web サーバーの実際のアドレスが含まれます (ここでも dns 名を使用できます)。

于 2010-12-12T11:02:09.960 に答える
3

これは古い質問だと思いますが、最近ではできます。

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://192.168.1.5/filename.htm");
request.Host = "www.mywebstite.com";
WebResponse response = request.GetResponse();
于 2015-06-18T08:18:51.017 に答える
3

これは古いことは知っていますが、まったく同じ問題に遭遇し、ソケットまたはリフレクションを使用するよりも優れた解決策を見つけました...

私がしたことは、WebHeaderCollection から取得し、内部に貼り付けたものの検証をバイパスする新しいクラスを作成することでした。

public class MyHeaderCollection:WebHeaderCollection
{
    public new void Set(string name, string value)
    {
        AddWithoutValidate(name, value);
    }
    //or
    public new string this[string name]
    {
        get { return base[name]; }
        set { AddWithoutValidate(name, value); }
    }
}

使用方法は次のとおりです。

    var http = WebRequest.Create("http://example.com/");
    var headers = new MyHeaderCollection();
    http.Headers = headers;

    //Now you can add/override anything you like without validation:
    headers.Set("Host", http.RequestUri.Host);
    //or
    headers["Host"] = http.RequestUri.Host;

これがこれを探している人に役立つことを願っています!

于 2010-02-15T08:21:36.643 に答える
0

わかりました、少しの研究でこれが判明しました:

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=384456

MSはいつかこれについて何かをするかもしれないようです。

于 2008-12-11T11:33:00.787 に答える
0

この問題に私のソリューションを使用できます。ここに投稿されています:

HttpWebRequest でカスタム "Host" ヘッダーを設定するには?

これにより、ホスト ヘッダーを編集し、プロキシおよびダイレクト ソケット リクエストの使用を避けることができます。

于 2013-09-25T17:13:43.780 に答える
0

「ホスト」ヘッダーは保護されており、プログラムで変更することはできません。これを回避するには、リフレクションを介して WebRequest オブジェクトのプライベート "InnerCollection" プロパティにバインドし、それに対して "Set" ar "Add" メソッドを呼び出して Host ヘッダーを変更します。私はこれを試したことはありませんが、Reflector のソース コードをざっと見てみると、簡単に実行できると思います。しかし、そうです、フレームワーク オブジェクトのプライベート プロパティにバインドすることは、物事を達成するための最良の方法ではありません。:) しなければならない場合にのみ使用してください。

編集:または、リンクされた質問で他の人が言及しているように、ソケットを開いて手動で「GET」をすばやく実行してください。クッキーや HttpWebRequest が提供するその他の機能など、他のものをいじる必要がない場合は、簡単に行う必要があります。

于 2008-12-11T11:58:01.190 に答える