使用 cookie 重定向的 WebRequest 不起作用(Windows Build 15063)
Posted
技术标签:
【中文标题】使用 cookie 重定向的 WebRequest 不起作用(Windows Build 15063)【英文标题】:Redirected WebRequest with cookie not working (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 上运行吗?
【问题讨论】:
【参考方案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 版本中似乎已解决问题,请参阅有关此问题的详细信息here 和Fix 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
的构造函数。以上是关于使用 cookie 重定向的 WebRequest 不起作用(Windows Build 15063)的主要内容,如果未能解决你的问题,请参考以下文章
JQuery Ajax 在不设置 cookie 的情况下自动重定向?