WebClient keep session and cookie in same request

之前,我一直想login 后取到response cookie,然后add cooke to another request ,但是一直比较难取到response cookie.

之后,我add cookieContainer in webclient keep session


using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace GrabTask
{
    public class CookieAwareWebClient : WebClient
    {
        public CookieAwareWebClient()
            : base()
        {
            CookieContainer = new CookieContainer();
            this.ResponseCookies = new CookieCollection();
        }

        public CookieContainer CookieContainer { get; private set; }
        public CookieCollection ResponseCookies { get; set; }

        protected override WebRequest GetWebRequest(Uri address)
        {
            WebRequest request = base.GetWebRequest(address);

            HttpWebRequest webRequest = request as HttpWebRequest;
            if (webRequest != null)
            {
                webRequest.AllowAutoRedirect = true;
                webRequest.CookieContainer = CookieContainer;
            }

            return request;
        }

        protected override WebResponse GetWebResponse(WebRequest request)
        {
            var response = (HttpWebResponse)base.GetWebResponse(request);
            this.ResponseCookies = response.Cookies;
            return response;
        }
    }
}

call in program 

  

    private static void login(CookieAwareWebClient wc)
        {
            wc.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36";
            //wc.Headers.Add(HttpRequestHeader.Cookie, "JSESSIONID=88E39FF3D8A2749C1FCB902C22A00306");
            var reqparm = new System.Collections.Specialized.NameValueCollection();
           
            reqparm.Add("j_password", "******");
            reqparm.Add("j_username", "******");
            
            byte[] responsebytes1 = wc.UploadValues("https//ulr", "POST", reqparm);
        }
 using (CookieAwareWebClient wc = new CookieAwareWebClient())
            {
                login(wc);
                var reqparm1 = new System.Collections.Specialized.NameValueCollection();
                byte[] responsebytes = wc.UploadValues("other url", "POST", reqparm1);
                string responsebody = Encoding.Default.GetString(responsebytes);
                list_doc.LoadHtml(responsebody);

            }


other site site sample:

private CookieContainer cookieContainer = new CookieContainer();
public bool isServerOnline()
{
        Boolean ret = false;

        try
        {
            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(VPMacro.MacroUploader.SERVER_URL);
            req.CookieContainer = cookieContainer; // <= HERE
            req.Method = "HEAD";
            req.KeepAlive = false;
            HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
            if (resp.StatusCode == HttpStatusCode.OK)
            {
                // HTTP = 200 - Internet connection available, server online
                ret = true;
            }
            resp.Close();
            return ret;

        }
        catch (WebException we)
        {
            // Exception - connection not available
            Log.e("InternetUtils - isServerOnline - " + we.Status);
            return false;
        }
}

猜你喜欢

转载自blog.csdn.net/canduecho/article/details/79986769