Skip to main content
 首页 » 编程设计

c#之带 cookie 的重定向 WebRequest 不起作用(Windows 内部版本 15063)

2024年02月25日29sky-heaven

我创建了一个调用 Web 服务的 UWP 应用程序,该 Web 服务通过结合了 cookie 的重定向进行响应。

这适用于 Windows 10 版本 1803(内部版本 17134)
当切换到 Windows 10 Creators Update(内部版本 15063)以便它将在 Windows 10 Mobile 上运行时它停止工作(在 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 上运行吗?

请您参考如下方法:

我发现 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(); 
    // ... 
 }