none
HttpWebRequest HttpContext.Current cookies 第二次访问经常会超时 RRS feed

  • 问题

  •         /// <summary>
            /// 访问网站
            /// linyee
            /// 本身打算加个与外部共享cookie功能,但折腾了两天,老是会超时,只能暂时放弃,应该是某个资源没有被及时关闭引起的
            /// </summary>
            /// <param name="url"></param>
            /// <param name="httpMethod"></param>
            /// <param name="postString"></param>
            /// <param name="refurl"></param>
            /// <param name="ContentType"></param>
            /// <returns></returns>
    
            public static string RequestUrl(string url,string httpMethod="Get", string postString="", string refurl= "",string ContentType= "text/plain")
            {//text/json plain html xml application/javascript application/json application/octet stream application/xml
                //application/x-www-form-urlencoded
                HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
                if (string.IsNullOrEmpty(refurl)) refurl = HttpContext.Current.Request.UrlReferrer.AbsoluteUri;
                if (string.IsNullOrEmpty(refurl)) refurl = UrlHelperLy.GetAppRootUrl();
    
                if (System.Net.ServicePointManager.DefaultConnectionLimit<500)
                System.Net.ServicePointManager.DefaultConnectionLimit = 500;
                System.GC.Collect();//垃圾回收 防止线程满超时
    
                refurl.WriteLog("refurl");
                req.Referer = HttpUtility.UrlEncode(refurl, Encoding.UTF8);
                //CookieContainer_ = (CookieContainer)new FileLy<CookieContainer>().WebReadJsonToObject("cookies");
                //HttpContext.Current.Request.Cookies.WriteLogFormatJson();
                Uri uri = null;
                Uri.TryCreate(url,UriKind.Absolute,out uri);
                uri.Host.WriteLog("urlHost:");
    
                //加了这个功能第二次访问经常会超时
                //if (uri != null)
                //    if (CookieContainer_.GetCookies(uri).Count < 1)
                //        CookieContainer_.Add(HttpContext.Current.Request.Cookies, uri.Host);
    
                //CookieContainer_.WriteLogFormatJson("访问之前的cookies");
                req.CookieContainer = CookieContainer_;
                req.Method = httpMethod;
                req.ContentType = ContentType;
                req.ProtocolVersion = HttpVersion.Version10;
                req.KeepAlive = false;//防止超时卡死
    
                if (url.StartsWith("https://"))
                    //ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;//证书验证
                    ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);//GetResponse之前 https://使用
    
                //写入POST数据
                if (req.Method == "POST" && !string.IsNullOrEmpty(postString))//!string.IsNullOrWhiteSpace(postString__) && 
                {
                    byte[] bytes = Encoding.UTF8.GetBytes(postString);
                    Stream requestStream = req.GetRequestStream();
                    requestStream.Write(bytes, 0, bytes.Length);
                    requestStream.Close();//防止 卡死
                }
                else if (req.Method == "POST" && string.IsNullOrEmpty(postString))
                {
                    //没有数据时,设置0,不然会411错误 //get时不要写入,否则可能卡死
                    req.ContentLength = 0;
                }
                else
                {
    
                }
    
                HttpWebResponse res = null;
                try {//捕获500错误等
                    LogLy.WebLog("提交访问");
                    res=(HttpWebResponse)req.GetResponse();
                } catch(WebException wex)
                {
                    res = (HttpWebResponse)wex.Response;
                }catch (Exception ex)
                {
                    //
                    LogLy.WebLog(ex.ToJsonFormatString(), "Exception");
                }
    
                //if (cks.Count > 0)
                //    cks.WebSaveJson("cookies");
                //else
                //    cks=new FileLy<CookieCollection>().WebReadJsonToObject("cookies");
                //    //cks.WebReadJsonToObject();
                //CookieContainer_.WriteLogFormatJson("访问之后的cookies");
                //CookieContainer_.GetCookies("").WebSaveJson("cookies");
    
    
                var cks = res.Cookies.Clone();
                LogLy.WebLog("访问结束");
                CookieContainer_.Add(cks);
                //加了这个功能第二次访问经常会超时
                //cks.WriteLogFormatJson("返回的cookies");
                //if (HttpContext.Current != null && cks.Count > 0)
                //{
                //    foreach(Cookie c in cks)
                //    {
                //        HttpCookie hc = new HttpCookie(c.Name,c.Value);
                //        HttpContext.Current.Response.Cookies.Add(hc);
                //    }
                //}
                cks = null;
    
                //LogLy.WebLog("获取输出流");
                StreamReader rd = new StreamReader(res.GetResponseStream());
                string theContent = rd.ReadToEnd();
                rd.Close();
    
                //回收资源 防止线程满超时
    
                res.Close();
                res = null;
    
                req.Abort();
                req = null;
    
                return theContent;
            }
    

    如题如备注,打开外部cookies访问

    有时第一次访问就卡死超时了,,,

    不知哪里用错了

    2017年8月22日 2:22

答案

  • 你好,

    如果是超时错误,那么出现异常的应该是下面的代码:

    res=(HttpWebResponse)req.GetResponse();

    所以,问题的原因不是请求超时。

    我建议你用Fiddler或者 F12开发者工具去检测一下返回的response, 例如:

    如果response不包含set-cookie,说明server端没有返回cookie, 造成这个异常的原因在sever 端, 可能是server端的cookie超时。你也可以修改你的代码,在clone之前先去检查是不是包含cookie。

    如果response包含set-cookie, 我建议你可以贴一下set-cookie 当中的内容,也许更容易帮助你解决问题。


    2017年9月5日 3:09
    版主
  •  现在已经全部打开功能,,,访问外网正常

    访问本项目 webform正常 。。

    只有在访问本项目webAPI时,第二次起就超时,无论哪个API页面

    项目 是webform跟webAPI MVC 三种合在一起的

    .net 4.6.2

    这是webAPI 什么的冲突吗?

    但是把API地址复制出来,单独在浏览器里打开又正常。。。

    所以还是webrequest的问题~~~

    我把webform独立出来就正常了~~~

    2017年9月7日 4:59

全部回复

  • Hi,

    感谢你在MSDN论坛发帖。

    你能告诉你具体项目类型是什么? ASP.NET 还是 winform ,还是其他类型。 这样有助于解决问题。

    ASP.NET,w微软是有专门的论坛支持的。

    卡死的同时有没有什么异常 错误信息,不然也很难发现问题所在.

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年8月22日 7:44
  • .net 4.6

    C# webform

    RequestUrl post 访问 本机API  http://192.168.xxx.xxx/api/Member/MemberLoginTokenSign?appid=4e55c4aa-72de-43a3-a6ab-5cb1d10ae539&timestamp=1503390533433&sign=99381BCB008CA4B028B92611B0C5956D

    异常提示就是res.Cookies.Clone(); 空指针,,,其实就是超时错误


    2017年8月22日 8:47
  • Hi,

    因为你的问题涉及到web form, 我将会把这个帖子移到对应的论坛去。

    我建议你可以尝试延迟cookie过期的时间。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    2017年8月22日 9:03
  • 你好,

    如果是超时错误,那么出现异常的应该是下面的代码:

    res=(HttpWebResponse)req.GetResponse();

    所以,问题的原因不是请求超时。

    我建议你用Fiddler或者 F12开发者工具去检测一下返回的response, 例如:

    如果response不包含set-cookie,说明server端没有返回cookie, 造成这个异常的原因在sever 端, 可能是server端的cookie超时。你也可以修改你的代码,在clone之前先去检查是不是包含cookie。

    如果response包含set-cookie, 我建议你可以贴一下set-cookie 当中的内容,也许更容易帮助你解决问题。


    2017年9月5日 3:09
    版主
  •  感谢您的回答,,

    现在的代码都是正常的,,,

    服务端的确可能没有返回cookie

    但现在的代码是正常的,主要是把那两个注释的其中一个打开就会出现这种问题

           //加了这个功能第二次访问经常会超时

    而且测试过了,是在

    res=(HttpWebResponse)req.GetResponse();
    

    这一句超时

    值得一提的是,GetResponse 之后的那个注释,,有时第一天一整天都测试正常,第二天忽然就不行了~~~~~

    (这个经测试回收应用池后也可能出现超时)

    大约一分半钟超时

    2017/9/7 9:20:45	level=0	linyee.App_Code.ConfigLy.RequestUrl(System.String url,System.String httpMethod=Get,System.String postString=,System.String refurl=,System.String ContentType=text/plain)	提交访问
    2017/9/7 9:22:25	level=0	linyee.App_Code.ConfigLy.RequestUrl(System.String url,System.String httpMethod=Get,System.String postString=,System.String refurl=,System.String ContentType=text/plain)	异常:请求被中止: 操作超时。
    2017/9/7 9:22:25	level=0	linyee.App_Code.ConfigLy.RequestUrl(System.String url,System.String httpMethod=Get,System.String postString=,System.String refurl=,System.String ContentType=text/plain)	访问结束
    

    继续测试后

    界定 代码更新过,更新DLL后就会。。。。所有其它网站都正常。。。只有本站点,,,不论是本地还是远程更新了DLL就会。。。

    继续测试中。。。

    2017年9月7日 0:39
  •  现在已经全部打开功能,,,访问外网正常

    访问本项目 webform正常 。。

    只有在访问本项目webAPI时,第二次起就超时,无论哪个API页面

    项目 是webform跟webAPI MVC 三种合在一起的

    .net 4.6.2

    这是webAPI 什么的冲突吗?

    但是把API地址复制出来,单独在浏览器里打开又正常。。。

    所以还是webrequest的问题~~~

    我把webform独立出来就正常了~~~

    2017年9月7日 4:59
  • 完全不理解,,

    please verify my account

    2017年9月14日 23:55
  • 简单点,,,

    就是一个项目里面包含这三种模块 webfrom webapi mvc

    webfrom 用于测试API用的,,,

    用了上边函数。。。。。。

    起初因为访问本地的API卡了,测试线上的、其它的所以也卡了。。。。。以为是针对所有网址卡死

    最后一天测试时,却是发现主要是访问项目内API卡死。。。。

    2017年9月15日 0:17