如何在HttpWebRequest中设置自定义主机头?我知道通常这个类不允许你这样做,但是反正用反射或类似的东西,而实际上并不需要我用TCPClient发送整个数据包?如何在HttpWebRequest中设置自定义“主机”标头?
回答
还有就是要做到这一点迂回的方式,如下所述:
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-20 17:37:20
耻辱我不使用看起来不错的.NET 4。 – 2009-09-20 18:05:29
你可以使用代理服务器,请参阅我的答案在: Request Web Page in c# spoofing the Host
您可以使用此技巧,设计用于在.net 3.5解决这个问题。
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Reflection;
namespace ConsoleApplication6
{
class Program
{
static void Main(string[] args)
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://198.252.206.16");
FieldInfo headersFieldInfo = request.GetType().GetField("_HttpRequestHeaders", System.Reflection.BindingFlags.NonPublic
| System.Reflection.BindingFlags.Instance
| System.Reflection.BindingFlags.GetField);
CusteredHeaderCollection WssHeaders = new CusteredHeaderCollection("stackoverflow.com");
headersFieldInfo.SetValue(request, WssHeaders);
request.Proxy = null;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream());
string result = sr.ReadToEnd();
Console.WriteLine(result);
Console.ReadLine();
}
public class CusteredHeaderCollection : WebHeaderCollection
{
public bool HostHeaderValueReplaced { get;private set; }
public string ClusterUrl { get; private set; }
public CusteredHeaderCollection(string commonClusterUrl) : base()
{
if (string.IsNullOrEmpty("commonClusterUrl"))
throw new ArgumentNullException("commonClusterUrl");
this.ClusterUrl = commonClusterUrl;
}
public override string ToString()
{
this["Host"] = this.ClusterUrl;
string tmp = base.ToString();
this.HostHeaderValueReplaced = true;
return tmp;
}
}
}
}
Necromancing。
对于那些仍然使用.NET 2.0的人
事实上,如果你知道如何,它其实很简单。
问题是,您无法设置主机头,因为框架不会让您在运行时更改该值。 (.net framework 4.0+会让你在httpwebrequest中覆盖主机)。
下一次尝试将设置带反射的标题,以避开它,这将允许您更改标题值。但是在运行时,它会用url的主机部分覆盖这个值,这意味着反射会给你带来什么。
如果dns-name不存在,这很坦率地说是你首先想做的唯一情况,你不能设置它,因为.NET无法解决它,并且您无法重写.NET DNS解析器。
但是你可以做的是设置一个webproxy,其IP地址与目标服务器完全相同。
所以,如果你的服务器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是虚拟Web服务器基于名称的托管(基于http-host-header)。
不错,适用于.NET 2.0。很显然,如果你真的需要使用代理服务器,这将不起作用;)只需升级到.NET 4.5 - WebRequest和WebClient都不推荐使用。 – User1 2016-12-21 08:19:58
- 1. 在HttpWebRequest中添加自定义标头
- 2. 如何在PHP中设置自定义REQUEST标头
- 3. 如何在PHP中设置自定义标头
- 4. 如何在AWS S3中设置自定义响应标头
- 5. 如何在反应本机中为webView请求设置自定义标头
- 6. Dojo rpc.JsonService - 设置自定义标头
- 7. SoapClient设置自定义HTTP标头
- 8. 为WebClient设置自定义标头
- 9. SDWebImage并设置自定义HTTP标头?
- 10. 使用HttpURLConnection设置自定义标头
- 11. 如何在Apache虚拟主机中使用CloudFront中的自定义标头
- 12. HTTPWebRequest,如何防止更改大小写的主机/标头值
- 13. 如何为自定义模块设置自定义主题?
- 14. 是否有可能在WebView中设置自定义HTTP标头
- 15. 在PHP中设置LiteSpeed的自定义HTTP响应标头
- 16. 无法在$ .ajax中设置自定义标头
- 17. 如何在发布请求时在HTTP标头中设置自定义变量
- 18. 如何在CXF-RS Camel中设置自定义响应头?
- 19. ZF Curl - 如何在适配器中不允许设置自定义标头
- 20. mitmproxy重定向请求本地主机和设置主机标头
- 21. 如何设置HttpWebRequest的认证标头Authenticationresult
- 22. 自定义SOAP标头如何与自定义WCF标头相关联?
- 23. 设置自定义响应头
- 24. 如何在摆动中设置光标的自定义大小?
- 25. 如何在jsviews中将css设置为自定义标签(datepicker)?
- 26. 如何在自定义NSView中设置游标?
- 27. 如何在html中设置自定义光标?
- 28. 如何在Phalcon控制器中设置自定义标题
- 29. 如何在Scrapy项目中设置自定义标志?
- 30. 如何在自定义javascript对象中设置标签onclick?
你想要在标题中更改什么?因为大部分标题参数可以通过属性间接修改 – 2009-09-20 12:46:32
为什么你需要自己设置“主机”标题。如果您向“www.google.com”发出请求,它只会成为主机标题。 – 2009-09-20 12:54:22
@Yannick主机和其他保留参数不能。 – 2009-09-20 17:36:03