6

HttpWebRequest でカスタム Host ヘッダーを設定するにはどうすればよいですか? 通常、このクラスでは許可されていないことはわかっていますが、実際にTCPClientでパケット全体を送信する必要なく、リフレクションなどを使用する方法はありますか?

4

5 に答える 5

5

ここで説明するように、これを行うための回り道があります。

http://blogs.msdn.com/feroze_daud/archive/2005/03/31/404328.aspx

ただし、フレームワークの次のバージョン (.NET Framework 4.0) では、より簡単になります。

http://blogs.msdn.com/ncl/archive/2009/07/20/new-ncl-features-in-net-4-0-beta-2.aspx

お役に立てれば。

于 2009-09-20T15:25:41.070 に答える
3

ネクロマンシング。
まだ .NET 2.0を使用
している場合 方法を知っていれば、実際には非常に簡単です。

問題は、フレームワークが実行時に値を変更できないため、ホスト ヘッダーを設定できないことです。(.net フレームワーク 4.0 以降では、httpwebrequest でホストをオーバーライドできます)。

次の試みは、リフレクションを使用してヘッダーを設定し、それを回避してヘッダー値を変更できるようにすることです。ただし、実行時に、この値は URL のホスト部分で上書きされます。つまり、リフレクションは何ももたらしません。

dns-name が存在しない場合 (率直に言って、そもそもこれを実行したい唯一のケースです)、.NET では解決できないため、設定できません。 .NET DNS リゾルバーをオーバーライドします。

しかし、できることは、宛先サーバーとまったく同じ IP を持つ webproxy を設定することです。

したがって、サーバー IP が 28.14.88.71 の場合:

public class myweb : System.Net.WebClient
{
    protected override System.Net.WebRequest GetWebRequest(System.Uri address)
    {
        System.Net.WebRequest request = (System.Net.WebRequest)base.GetWebRequest(address);
        //string host = "redmine.nonexistantdomain.com";

        //request.Headers.GetType().InvokeMember("ChangeInternal",
        //    System.Reflection.BindingFlags.NonPublic |
        //    System.Reflection.BindingFlags.Instance |
        //    System.Reflection.BindingFlags.InvokeMethod, null,
        //    request.Headers, new object[] { "Host", host }
        //);

        //server IP and port
        request.Proxy = new System.Net.WebProxy("http://28.14.88.71:80");

        // .NET 4.0 only
        System.Net.HttpWebRequest foo = (System.Net.HttpWebRequest)request;
        //foo.Host = host;

        // The below reflection-based operation is not necessary, 
        // if the server speaks HTTP 1.1 correctly
        // and the firewall doesn't interfere
        // https://yoursunny.com/t/2009/HttpWebRequest-IP/
        System.Reflection.FieldInfo horribleProxyServicePoint = (typeof(System.Net.ServicePoint))
            .GetField("m_ProxyServicePoint", System.Reflection.BindingFlags.NonPublic |
            System.Reflection.BindingFlags.Instance);

        horribleProxyServicePoint.SetValue(foo.ServicePoint, false);
        return foo;



        return request;
    }


    }

そしてほら、今

myweb wc = new myweb();
string str = wc.DownloadString("http://redmine.non-existant-domain.com");

28.14.88.71 が仮想名前ベースのホスティング (http-host-header に基づく) を備えた Web サーバーである場合、正しいページが返されます。

于 2016-12-19T15:03:41.090 に答える
1

WebClient はそれを許可します。

var client = new WebClient();
client.Headers.Add( "Host", WebHeader );

理由は言えませんでした。ドキュメントには、Host がシステム ヘッダーであることが明確に記載されています。

于 2016-05-03T06:07:25.140 に答える
0

プロキシを使用できます。私の回答を参照してください: Request Web Page in c# spoofing the Host

于 2010-12-12T11:10:02.643 に答える