代码之家  ›  专栏  ›  技术社区  ›  lokimidgard

cookie不工作时重定向的WebRequest(Windows内部版本15063)

  •  1
  • lokimidgard  · 技术社区  · 7 年前

    我创建了一个uwp应用程序,它调用WebServicewich响应,并将重定向与cookie结合起来。

    这适用于Windows 10,版本1803(内部版本17134)
    当切换到Windows 10 Creators更新(内部版本15063)以便在Windows 10 Mobile上运行时,它停止工作(在PC和Mobile上)

    使用fiddler可以看到当请求被重定向时,cookie不再被使用。

    public static async System.Threading.Tasks.Task<double> GetCreditAsync(string number, string pun, System.Threading.CancellationToken cancel = default(System.Threading.CancellationToken))
    {
        var cookieContainer = new CookieContainer();
    
        var request = System.Net.WebRequest.Create("http://test.test") as HttpWebRequest;
        using (cancel.Register(() => request.Abort(), useSynchronizationContext: false))
        {
            request.Method = "POST";
            request.CookieContainer = cookieContainer;
    
            request.ContentType = "multipart/form-data; boundary=---------------------------7e23ca1f27119e";
            var data = "-----------------------------7e23ca1f27119e"
            + "\n" + "Content-Disposition: form-data; name=\"data1\""
            + "\n" + ""
            + "\n" + number
            + "\n" + "-----------------------------7e23ca1f27119e"
            + "\n" + "Content-Disposition: form-data; name=\"data2\""
            + "\n" + ""
            + "\n" + pun
            + "\n" + "-----------------------------7e23ca1f27119e--"
            + "\n" + "";
            var buffer = System.Text.Encoding.UTF8.GetBytes(data);
            using (var requeststream = await request.GetRequestStreamAsync())
                requeststream.Write(buffer, 0, buffer.Length);
    
            using (var response = (await request.GetResponseAsync()) as HttpWebResponse)
            {
                using (var responseStream = response.GetResponseStream())
                using (var stream = new StreamReader(responseStream))
                {
                    var text = await stream.ReadToEndAsync();
                    value = GetValue(text);
                    return value;
                }
            }
        }
    }
    

    知道如何在Windows Phone上工作吗?

    2 回复  |  直到 7 年前
        1
  •  2
  •   lokimidgard    7 年前

    我发现httpclient有一个构造函数 HttpMessageHandler .当 HttpRequest 没有 (还没有) 如果有禁用自动重定向的选项,可以在 HttpClientHandler .

    var cookieContainer = new CookieContainer();
    using (var client = new HttpClient(new HttpClientHandler()
    {
        CookieContainer = cookieContainer,
        UseCookies = true,
        AllowAutoRedirect = false
    }))
    {
        var content = new MultipartFormDataContent
            {
                { new StringContent(number), "data1" },
                { new StringContent(pun), "data2" },
            };
    
        var result = await client.PostAsync(RequestUriString, content, cancel);
        result = await client.GetAsync(RequestUriString, cancel);
    
    
        var text = await result.Content.ReadAsStringAsync();
        // ...
     }
    
        2
  •  1
  •   Breeze Liu - MSFT    7 年前

    在新的UWP版本中,它似乎是一个固定的问题,请参阅有关此问题的详细信息。 here Fix HttpClient redirection logic on UAP .

    要使cookie在Windows Phone或早期版本中正常工作,可以尝试使用 HttpCookieManager 等级和 HttpCookie Windows.Web.Http 命名空间。

    //To get/set cookies
    using (var protocolFilter = new HttpBaseProtocolFilter())
    {
        //get CookieManager instance
        var cookieManager = protocolFilter.CookieManager;
        //get cookies
        var cookies = cookieManager.GetCookies(uri);
        foreach (var cookie in cookies)
        {
            Debug.Write(cookie.Value);
        }
        //you can also SetCookie
        //cookieManager.SetCookie(MyCookie);
    }
    

    您可以使用 CookieUsageBehavior 属性。

    var protocolFilter = new HttpBaseProtocolFilter()
    //Do not handle cookies automatically. you can set it as your requirements.
    protocolFilter.CookieUsageBehavior = HttpCookieUsageBehavior.NoCookies;
    // Create a HttpClient
    var httpClient = new HttpClient(protocolFilter);