Grabbing Cookies in Web Browser Control - WP7

后端 未结 5 730
Happy的楠姐
Happy的楠姐 2020-12-09 00:35

In order to log into a certain part of a website the users of my application require their cookie. To do this I need to grab it and pass it to url.

Does anyone know

5条回答
  •  青春惊慌失措
    2020-12-09 01:14

    As @quetzalcoatl already suggested, you can use internal instance of WebRequestCreator to share cookies between browser instances and instances of WebRequest. You don't get to access the cookies directly though, I think that's just a security measure by Microsoft.

    This code below creates a WebReqeust object, connected to CookieContainer of WebBrowser instance. It then posts to a url to log in the user and store cookies in the container. After it's done, all browser instances within the app instance will have required set of cookies.

    var browser = new WebBrowser();
    var brwhttp = typeof (WebRequestCreator).GetProperty("BrowserHttp");
    var requestFactory = brwhttp.GetValue(browser, null) as IWebRequestCreate;
    var uri = new Uri("https://www.login.com/login-handler");
    
    var req = requestFactory.Create(uri);
    req.Method = "POST";
    
    var postParams = new Dictionary { 
        {"username", "turtlepower"}, 
        {"password": "ZoMgPaSSw0Rd1"}
    };
    
    req.BeginGetRequestStream(aReq => {
    
        var webRequest = (HttpWebRequest)aReq.AsyncState;
        using (var postStream = webRequest.EndGetRequestStream(aReq)) {
    
            // Build your POST request here
            var postDataBuilder = new StringBuilder();
            foreach (var pair in paramsDict) {
                if (postDataBuilder.Length != 0) {
                    postDataBuilder.Append("&");
                }
                postDataBuilder.AppendFormat("{0}={1}", pair.Key, HttpUtility.UrlEncode(pair.Value));
            }
    
            var bytes = Encoding.UTF8.GetBytes(postDataBuilder.ToString());
            postStream.Write(bytes, 0, bytes.Length);
        }
    
        // Receive response 
        webRequest.BeginGetResponse(aResp => {
    
            var webRequest2 = (HttpWebRequest) aResp.AsyncState;
    
            webRequest = (HttpWebRequest)aResp.AsyncState;
            string resp;
    
            using (var response = (HttpWebResponse)webRequest2.EndGetResponse(aResp)) {
                using (var streamResponse = response.GetResponseStream()) {
                    using (var streamReader = new System.IO.StreamReader(streamResponse)) {
                        resp = streamReader.ReadToEnd();
                    }
                }
            }
    
        }, webRequest);
    }, req);
    

    One of the issues I couldn't solve though was exceptions thrown when server returns 302 - it seems to throw WebException error with "Not found" description.

提交回复
热议问题