如何复用WebView2的Cookie通过WebClient下载PDF文件
问题原因
你之前的实现存在两个核心错误:
- 没有使用WebView2官方提供的Cookie管理接口获取Cookie,手动监听请求头捞取Cookie容易遗漏、且容易取到错误的字段
- 你尝试读取的
Login不是标准请求头字段,会话Cookie的键名由服务端定义(常见为JSESSIONID、ASP.NET_SessionId等),直接读取Login当然拿不到有效凭证
解决方法
直接调用CoreWebView2.CookieManager.GetCookiesAsync就能获取指定域名下所有有效Cookie,拼接成WebClient要求的格式即可,不需要监听任何Web资源请求事件:
Private Async Sub WebView_Browser2_NavigationCompleted(sender As Object, e As CoreWebView2NavigationCompletedEventArgs) Handles WebView_Browser2.NavigationCompleted Dim url As String = pathtourl Dim fileName As String = "pdf.pdf" Dim targetUri = New Uri(url, UriKind.Absolute) ' 从WebView2的Cookie管理器获取目标域名下所有Cookie Dim cookieCollection = Await WebView_Browser2.CoreWebView2.CookieManager.GetCookiesAsync(targetUri.AbsoluteUri) ' 拼接为WebClient支持的Cookie格式:key1=val1; key2=val2 Dim cookieHeader As New Text.StringBuilder() For Each cookie In cookieCollection If cookieHeader.Length > 0 Then cookieHeader.Append("; ") End If cookieHeader.Append($"{cookie.Name}={cookie.Value}") Next ' 携带Cookie下载文件,Using自动释放WebClient资源 Using webClient As New WebClient() webClient.Headers.Add(HttpRequestHeader.Cookie, cookieHeader.ToString()) Await webClient.DownloadFileTaskAsync(targetUri, fileName) End Using End Sub
你之前写的WebResourceRequested、WebResourceResponseReceived相关的监听代码全部可以删除,不需要用到。
注意事项
- 两个WebView实例配置了相同的
UserDataFolder,Cookie本身就是共享的,从任意一个实例的CookieManager都能拿到有效凭证 GetCookiesAsync传入目标PDF的域名即可,不要传通配符,避免拿到无关域名的冗余Cookie
内容的提问来源于stack exchange,提问作者Desz
相关产品推荐
相关产品推荐

