代码之家  ›  专栏  ›  技术社区  ›  Oleg Sh

如何使用cookie在浏览器中打开页面?

  •  0
  • Oleg Sh  · 技术社区  · 6 年前

    例如,我有一个网页(ASP.NETMVC),在那里我得到一些资源的cookie。

            CookieContainer cookies = new CookieContainer();
            HttpClientHandler handler = new HttpClientHandler();
            handler.CookieContainer = cookies;
            string data = "<Request><MsgType>Authenticate</MsgType><SubMsgType>Login</SubMsgType><UserID>MYLOGIN</UserID><passwordNotEncrypted>MYPASSWORD</passwordNotEncrypted></Request>";
            StringContent content = new StringContent(data, Encoding.UTF8, "text/xml");
    
            HttpClient client = new HttpClient(handler);
            Uri uri = new Uri("https://address/browserservices.aspx/login");
            HttpResponseMessage response = client.PostAsync(uri, content).Result;
    

    此请求将auth cookie设置为 cookies 变量。下一个请求很好:

            var result = client.GetAsync("https://address/RemoteSupport.aspx?id=bla-bla-bla&pltFrmType=Android&agentversion=13.46").Result;
            var text = result.Content.ReadAsStringAsync().Result;
    

    (如果我叫它没有饼干,我会得到 Unauthorized

    现在我想重定向到这个 https://address/RemoteSupport.aspx?id=bla-bla-bla&pltFrmType=Android&agentversion=13.46 带cookie的地址。所以,用户应该看看它重定向到这个地址。怎么做?

            foreach (Cookie cookie in responseCookies)
            {
                Response.Cookies.Append(cookie.Name, cookie.Value);
            }
    
            return Redirect($"https://address/RemoteSupport.aspx?id={id}&pltFrmType=Android&agentversion=13.46");
    

    但它不起作用

    1 回复  |  直到 6 年前
        1
  •  0
  •   ste-fu    6 年前

    你不能只做重定向。在MVC中,向浏览器返回302状态码,指示浏览器向第三方站点发出自己的请求。

    使用相同的 HttpClient 您需要向第三方服务器发出第二个请求。这将自动将cookie添加到新请求中,然后您可以格式化答案并将其传递给浏览器客户端。

    理想情况下,您不应该在方法中实例化HttpClient,因为这意味着您每次必须发出2个请求。也许是这样的:

    public class MyController : Controller
    {
        private static readonly HttpClient _httpClient;
    
        public MyController()
        {
            if (_httpClient == null)
            {
                CookieContainer cookies = new CookieContainer();
                HttpClientHandler handler = new HttpClientHandler();
                handler.CookieContainer = cookies;
                _httpClient = new HttpClient(handler);
    
                LoginWithClient();
            }
        }
    
        private void LoginWithClient()
        {
            string data = "<Request><MsgType>Authenticate</MsgType><SubMsgType>Login</SubMsgType><UserID>MYLOGIN</UserID><passwordNotEncrypted>MYPASSWORD</passwordNotEncrypted></Request>";
            StringContent content = new StringContent(data, Encoding.UTF8, "text/xml");  
            Uri uri = new Uri("https://address/browserservices.aspx/login");
            HttpResponseMessage response = client.PostAsync(uri, content).Result; 
            // Maybe check the result here, but we should have the cookie by now
        }
    
        public JsonResult MyAction()
        {
            var result = client.GetAsync("https://address/RemoteSupport.aspx?id=bla-bla-bla&pltFrmType=Android&agentversion=13.46").Result;
            var text = result.Content.ReadAsStringAsync().Result;
            return Json(text, JsonRequestBehavior.AllowGet);
        }
    

    这应该将原始文本字符串返回到浏览器,您可以在浏览器中显示它,或者将其解析为Json或XML或其他格式,并处理数据。