苏飞论坛

标题: 当HttpHelper类遇到请求头含有 x-requested-with: XMLHttpRequest 的解决方法。。 [打印本页]

作者: cyberarmy    时间: 2013-5-7 14:11
标题: 当HttpHelper类遇到请求头含有 x-requested-with: XMLHttpRequest 的解决方法。。
在使用 HttpHelper类时遇到一个问题,就是当抓包时某些请求头里含有,x-requested-with: XMLHttpRequest

这个时候,按正常的请求参数,WebRequest请求始终得不到响应或者得到504.。


这时候只需要在 发送请求的时候添加以下代码即可:



[code=csharp]ProtocolVersion = new Version("1.0"); [/code]      






作者: 站长苏飞    时间: 2013-5-7 14:17
没看懂,这种直接在Header里添加参数也行吧。如下代码[code=csharp]
HttpHelper http = new HttpHelper();
            HttpItem item = new HttpItem()
            {
                URL = "http://www.sufeinet.com",//URL     必需项
                Encoding = null,//编码格式(utf-8,gb2312,gbk)     可选项 默认类会自动识别
                 //Encoding = Encoding.Default,
                Method = "get",//URL     可选项 默认为Get
            };
            item.Header.Add("x-requested-with", "XMLHttpRequest");
         
            //得到HTML代码
            HttpResult result = http.GetHtml(item);[/code]
你的这个写法要怎么用啊,只是写个ProtocolVersion = new Version("1.0");要怎么写到Httphelper里呢?
作者: yangying    时间: 2013-5-7 14:17
求用法
作者: cyberarmy    时间: 2013-5-7 21:37
直接加到 Header里貌似不行,我试过。

必须这样:

[code=csharp]        /// <summary>
        /// 为请求准备参数
        /// </summary>
        ///<param name="objhttpItem">参数列表</param>
        /// <param name="_Encoding">读取数据时的编码方式</param>
        private void SetRequest(HttpItem objhttpItem)
        {
            // 验证证书
            SetCer(objhttpItem);
            //设置Header参数
            if (objhttpItem.Header != null && objhttpItem.Header.Count > 0)
            {
                foreach (string item in objhttpItem.Header.AllKeys)
                {
                    request.Headers.Add(item, objhttpItem.Header[item]);
                }
            }
            // 设置代理
            SetProxy(objhttpItem);
            //请求方式Get或者Post
            request.Method = objhttpItem.Method;
            request.Timeout = objhttpItem.Timeout;
            request.ProtocolVersion = new Version("1.0");                //加上这句
            request.ReadWriteTimeout = objhttpItem.ReadWriteTimeout;
            //Accept
            request.Accept = objhttpItem.Accept;
            //ContentType返回类型
            request.ContentType = objhttpItem.ContentType;
            //UserAgent客户端的访问类型,包括浏览器版本和操作系统信息
            request.UserAgent = objhttpItem.UserAgent;
            // 编码
            encoding = objhttpItem.Encoding;
            //设置Cookie
            SetCookie(objhttpItem);
            //来源地址
            request.Referer = objhttpItem.Referer;
            //是否执行跳转功能
            request.AllowAutoRedirect = objhttpItem.Allowautoredirect;
            //设置Post数据
            SetPostData(objhttpItem);
            //设置最大连接
            if (objhttpItem.Connectionlimit > 0)
                request.ServicePoint.ConnectionLimit = objhttpItem.Connectionlimit;
        }[/code]


作者: yangying    时间: 2013-5-7 21:41
cyberarmy 发表于 2013-5-7 21:37
直接加到 Header里貌似不行,我试过。

必须这样:

ProtocolVersion = new Version("1.0");  楼主没看到你用这个啊,
你上面写的是苏飞Httphelper类的源代码,好像没什么变化吧
作者: cyberarmy    时间: 2013-5-7 21:43
站长苏飞 发表于 2013-5-7 14:17
没看懂,这种直接在Header里添加参数也行吧。如下代码
你的这个写法要怎么用啊,只是写个ProtocolVersion  ...

在加入这个代码的同时,修改 SetRequest方法。。

代码如下:


[code=csharp]item.Header.Add("x-requested-with", "XMLHttpRequest");       //必须[/code]





[code=csharp]        /// <summary>
        /// 为请求准备参数
        /// </summary>
        ///<param name="objhttpItem">参数列表</param>
        /// <param name="_Encoding">读取数据时的编码方式</param>
        private void SetRequest(HttpItem objhttpItem)
        {
            // 验证证书
            SetCer(objhttpItem);
            //设置Header参数
            if (objhttpItem.Header != null && objhttpItem.Header.Count > 0)
            {
                foreach (string item in objhttpItem.Header.AllKeys)
                {
                    request.Headers.Add(item, objhttpItem.Header[item]);
                }
            }
            // 设置代理
            SetProxy(objhttpItem);
            //请求方式Get或者Post
            request.Method = objhttpItem.Method;
            request.Timeout = objhttpItem.Timeout;
            request.ProtocolVersion = new Version("1.0");        //必须
            request.ReadWriteTimeout = objhttpItem.ReadWriteTimeout;
            //Accept
            request.Accept = objhttpItem.Accept;
            //ContentType返回类型
            request.ContentType = objhttpItem.ContentType;
            //UserAgent客户端的访问类型,包括浏览器版本和操作系统信息
            request.UserAgent = objhttpItem.UserAgent;
            // 编码
            encoding = objhttpItem.Encoding;
            //设置Cookie
            SetCookie(objhttpItem);
            //来源地址
            request.Referer = objhttpItem.Referer;
            //是否执行跳转功能
            request.AllowAutoRedirect = objhttpItem.Allowautoredirect;
            //设置Post数据
            SetPostData(objhttpItem);
            //设置最大连接
            if (objhttpItem.Connectionlimit > 0)
                request.ServicePoint.ConnectionLimit = objhttpItem.Connectionlimit;
        }[/code]
作者: yangying    时间: 2013-5-7 21:44
cyberarmy 发表于 2013-5-7 21:43
在加入这个代码的同时,修改 SetRequest方法。。

代码如下:

看到了,你是说这两个参数都必须要加是吧。
作者: cyberarmy    时间: 2013-5-7 23:48
yangying 发表于 2013-5-7 21:44
看到了,你是说这两个参数都必须要加是吧。

对,两个地方都需要设置。
作者: yangying    时间: 2013-5-8 06:15
cyberarmy 发表于 2013-5-7 23:48
对,两个地方都需要设置。

嗯好的谢谢,我记录下,我们下次升级,也加下这个属性,可以发下你访问的那个网站吗
作者: yangying    时间: 2013-5-8 06:15
cyberarmy 发表于 2013-5-7 23:48
对,两个地方都需要设置。

嗯好的谢谢,我记录下,我们下次升级,也加下这个属性,可以发下你访问的那个网站吗
作者: cyberarmy    时间: 2013-5-8 06:25
本帖最后由 cyberarmy 于 2013-5-8 06:29 编辑
yangying 发表于 2013-5-8 06:15
嗯好的谢谢,我记录下,我们下次升级,也加下这个属性,可以发下你访问的那个网站吗

百度贴吧回帖的时候,请求头里就有。


(, 下载次数: 280)