【问题标题】:Redirected WebRequest with cookie not working (Windows Build 15063)使用 cookie 重定向的 WebRequest 不起作用(Windows Build 15063)
【发布时间】:2018-11-27 14:33:55
【问题描述】:

我创建了一个 UWP 应用程序,该应用程序调用 Web 服务至极响应,并结合了 cookie 的重定向。

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

使用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 上运行吗?

【问题讨论】:

    标签: c# uwp windows-10-mobile


    【解决方案1】:

    我发现 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】:

      在新的 UWP 版本中似乎已解决问题,请参阅有关此问题的详细信息hereFix HttpClient redirection logic on UAP

      为了使 Cookie 在 Windows phone 或之前版本中正常工作,您可以尝试在 Windows.Web.Http 命名空间中使用 HttpCookieManager 类和 HttpCookie 类。

      //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 属性定义 cookie 使用行为。

      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);
      

      【讨论】:

      • 不幸的是,这不起作用。 HttpClient 没有采用 HttpBaseProtocolFilter 的构造函数。
      猜你喜欢
      • 2016-05-10
      • 2018-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      • 2020-06-21
      • 2015-02-27
      相关资源
      最近更新 更多