none
[framework4.0]HttpWebRequest.Host RRS feed

  • 问题

  • 在framework4.0中HttpWebRequest.Host属性是可以设置的http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest_members.aspx

    但是在我的测试项目中,我设置了Host属性后,通过抓取httpheader,Host还是localhost,请问这个怎么修改?

    Uri myuri = new Uri(lcUrl);
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(myuri);

    request.Host = myuri.Host;

    //request.Headers.Set("Host", "xxx.com");//直接修改是错误的,提示不能修改Host

     

    抓取到的:

    POST /index.aspx HTTP/1.1
    Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
    Referer: http://localhost:4716/index.aspx
    Accept-Language: en-us
    Content-Type: application/x-www-form-urlencoded
    UA-CPU: x86
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; InfoPath.2; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E)
    Host: localhost:4716
    Authorization: Basic Y3Jpcy5odWFuZ0BvbmxpbmVzYy5jb206RG9rbzEyMw==
    Connection: Keep-Alive
    Cache-Control: no-cache
    Content-Length: 158

     

    2010年6月28日 10:39

答案

  • 我试了一下,确实可以修改,而且用fiddler可以检测到Host和请求地址不同:

    Fiddler has detected a protocol violation in session #0.


    Request's Host header does not match Host specified in URI.


    URL Host: www.bing.com

    Header Host: xxx.com

     

    然而在fiddler中抓到的包依然显示Host为请求的目标。


    Tech Blog: http://gildor.cnblogs.com
    2010年6月28日 14:05

全部回复

  • 问题是你请求的地址是不是就是这个呢?
    family as water
    2010年6月28日 11:29
  • HttpWebRequest的Host是不能直接修改的,它会和构造时使用的uri一致,不过可以用设置代理的方式来达到类似的效果。具体方法可以参考这个:

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


    Tech Blog: http://gildor.cnblogs.com
    2010年6月28日 12:07
  • 问题是你请求的地址是不是就是这个呢?
    family as water

    我请求的肯定不是localhost的
    2010年6月28日 13:07
  • HttpWebRequest的Host是不能直接修改的,它会和构造时使用的uri一致,不过可以用设置代理的方式来达到类似的效果。具体方法可以参考这个:

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


    Tech Blog: http://gildor.cnblogs.com

    HttpWebRequest的Host在framework4.0中是可以修改的,请查看我给的MSDN的连接,这篇文章我看过,我请求的是https网站,一但设置代理就会报错。
    2010年6月28日 13:09
  • 我试了一下,确实可以修改,而且用fiddler可以检测到Host和请求地址不同:

    Fiddler has detected a protocol violation in session #0.


    Request's Host header does not match Host specified in URI.


    URL Host: www.bing.com

    Header Host: xxx.com

     

    然而在fiddler中抓到的包依然显示Host为请求的目标。


    Tech Blog: http://gildor.cnblogs.com
    2010年6月28日 14:05
  • 我自己写了个ASP.NET页面试了一下,发现修改的Host确实传到了服务器。我的网页代码是这样的:

    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write(Request.Headers["Host"]);
    }

    输出结果为xxx.com。因此Host确实已经被修改了,目前的现象看来只能说明我们采用的抓包工具都有问题。


    Tech Blog: http://gildor.cnblogs.com
    2010年6月28日 14:15
  • 我自己写了个ASP.NET页面试了一下,发现修改的Host确实传到了服务器。我的网页代码是这样的:

     

    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write(Request.Headers["Host"]);
    }

     

    输出结果为xxx.com。因此Host确实已经被修改了,目前的现象看来只能说明我们采用的抓包工具都有问题。


    Tech Blog: http://gildor.cnblogs.com
    你是说真实的请求已经发送到目标地址了?只是我们看到的是假的?
    2010年6月29日 1:06
  • 嗯,我想是这样的,你不妨也写一个这样的网页测试一下~

    下面附上我使用的客户端代码:

    static void Main(string[] args)
    {
        var request = (HttpWebRequest)HttpWebRequest.Create("http://localhost:55683/Default.aspx");
        request.Host = ("xxx.com");
        var response = request.GetResponse();
        using(var reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
        {
            Console.WriteLine(reader.ReadToEnd());
        }
        Console.ReadLine();
    }


    Tech Blog: http://gildor.cnblogs.com
    2010年6月29日 8:34
  • Host 在 NETFX 4 中确实可以修改,根据 MSDN 的描述,它的访问权限为 Get 和 Set (可读写)。
    Mark Zhou
    2010年6月29日 9:49
  • 嗯,我想是这样的,你不妨也写一个这样的网页测试一下~

    下面附上我使用的客户端代码:

     

    static void Main(string[] args)
    {
        var request = (HttpWebRequest)HttpWebRequest.Create("http://localhost:55683/Default.aspx");
        request.Host = ("xxx.com");
        var response = request.GetResponse();
        using(var reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
        {
            Console.WriteLine(reader.ReadToEnd());
        }
        Console.ReadLine();
    }

     


    Tech Blog: http://gildor.cnblogs.com

    请求好像是发送过去了,但是页面老是不跳转啊,像IE收到消息不就是直接跳转到这个页面了?
    2010年6月29日 13:36
  • 应该不会跳转吧,我只是让它输出了一串文本而已,要跳转的话要用Response.Redirect()。
    Tech Blog: http://gildor.cnblogs.com
    2010年6月29日 15:09
  • 应该不会跳转吧,我只是让它输出了一串文本而已,要跳转的话要用Response.Redirect()。
    Tech Blog: http://gildor.cnblogs.com
    我的到的是302消息啊,这个应该是指跳转啊,我没有获取到真实页面的源代码的。
    2010年6月30日 14:22
  • 自己再顶一次
    2010年7月1日 12:35
  • 再来一次
    2010年7月3日 3:35
  • 你是指你访问什么页面得到了302?我访问自己创建的测试页得到的是200 OK。
    Tech Blog: http://gildor.cnblogs.com
    2010年7月3日 15:52