HttpWebRequest でカスタム Host ヘッダーを設定するにはどうすればよいですか? 通常、このクラスでは許可されていないことはわかっていますが、実際にTCPClientでパケット全体を送信する必要なく、リフレクションなどを使用する方法はありますか?
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
お役に立てれば。
ネクロマンシング。
まだ .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 サーバーである場合、正しいページが返されます。
WebClient はそれを許可します。
var client = new WebClient();
client.Headers.Add( "Host", WebHeader );
理由は言えませんでした。ドキュメントには、Host がシステム ヘッダーであることが明確に記載されています。
プロキシを使用できます。私の回答を参照してください: Request Web Page in c# spoofing the Host