如何绕过受限的 HTTPWebRequest Headers
How can I Bypass restricted HTTPWebRequest Headers
我做了一个小辅助函数来处理我的 HTTP 请求,它只接受一个字符串 URL 和一个 header 的字符串数组,格式为 Header-Name: Value
public static HttpWebResponse MakeHttpRequest(string URL, string[] Headers)
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(URL);
req.Headers.Clear();
foreach (string h in Headers)
{
var s = h.Split(new char[] { ':' }, 2);
req.Headers.Set(s[0], s[1]);
}
return (HttpWebResponse)req.GetResponse();
}
但是如果 Headers 数组包含受限的 header(例如 User-Agent、或 Content-Type、或 Accept 等),我得到一个异常告诉我使用其 属性 或方法修改 header,所以我在想也许有某种方法可以检查是否有任何 Headers 受到限制并使用其 [=25= 自动修改它], 不幸的是,我不太聪明,所以我真的不知道如何做到这一点,而不需要大量臃肿的代码来检查每个受限 header 并且每个代码都有不同的代码 运行
我猜它可以通过反射来完成,但我不确定...帮助?
有静态方法可以检查 header 是否受到限制:
bool restricted = System.Net.WebHeaderCollection.IsRestricted(key); // key = s[0]
你可以像这样使用反射来设置相关的属性:
public static HttpWebResponse MakeHttpRequest(string URL, string[] Headers) {
HttpWebRequest req = (HttpWebRequest) WebRequest.Create(URL);
req.Headers.Clear();
foreach (string h in Headers) {
var s = h.Split(new char[] {':'}, 2);
var key = s[0];
var value = s[1];
if (WebHeaderCollection.IsRestricted(key)) {
// remove "-" because some header names contain it, but .NET properties do not
key = key.Replace("-", "");
// get property with header name
var prop = typeof(HttpWebRequest).GetProperty(key, BindingFlags.Instance | BindingFlags.Public);
// set, changing type if necessary (some properties are long, or date, and your values are always strings)
prop.SetValue(req, Convert.ChangeType(value, prop.PropertyType, CultureInfo.InvariantCulture));
}
else {
req.Headers.Set(s[0], s[1]);
}
}
return (HttpWebResponse) req.GetResponse();
}
如果要使用此代码,请确保针对所有受限 header(列出的 here)测试此代码,因为我没有。或者单独处理每个 header,因为只有 11 个,而不是一百个。
我做了一个小辅助函数来处理我的 HTTP 请求,它只接受一个字符串 URL 和一个 header 的字符串数组,格式为 Header-Name: Value
public static HttpWebResponse MakeHttpRequest(string URL, string[] Headers)
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(URL);
req.Headers.Clear();
foreach (string h in Headers)
{
var s = h.Split(new char[] { ':' }, 2);
req.Headers.Set(s[0], s[1]);
}
return (HttpWebResponse)req.GetResponse();
}
但是如果 Headers 数组包含受限的 header(例如 User-Agent、或 Content-Type、或 Accept 等),我得到一个异常告诉我使用其 属性 或方法修改 header,所以我在想也许有某种方法可以检查是否有任何 Headers 受到限制并使用其 [=25= 自动修改它], 不幸的是,我不太聪明,所以我真的不知道如何做到这一点,而不需要大量臃肿的代码来检查每个受限 header 并且每个代码都有不同的代码 运行 我猜它可以通过反射来完成,但我不确定...帮助?
有静态方法可以检查 header 是否受到限制:
bool restricted = System.Net.WebHeaderCollection.IsRestricted(key); // key = s[0]
你可以像这样使用反射来设置相关的属性:
public static HttpWebResponse MakeHttpRequest(string URL, string[] Headers) {
HttpWebRequest req = (HttpWebRequest) WebRequest.Create(URL);
req.Headers.Clear();
foreach (string h in Headers) {
var s = h.Split(new char[] {':'}, 2);
var key = s[0];
var value = s[1];
if (WebHeaderCollection.IsRestricted(key)) {
// remove "-" because some header names contain it, but .NET properties do not
key = key.Replace("-", "");
// get property with header name
var prop = typeof(HttpWebRequest).GetProperty(key, BindingFlags.Instance | BindingFlags.Public);
// set, changing type if necessary (some properties are long, or date, and your values are always strings)
prop.SetValue(req, Convert.ChangeType(value, prop.PropertyType, CultureInfo.InvariantCulture));
}
else {
req.Headers.Set(s[0], s[1]);
}
}
return (HttpWebResponse) req.GetResponse();
}
如果要使用此代码,请确保针对所有受限 header(列出的 here)测试此代码,因为我没有。或者单独处理每个 header,因为只有 11 个,而不是一百个。