本帖最后由 pjy612 于 2023-5-22 12:11 编辑
因为 微软要对 Xamarin 终止支持了。
https://dotnet.microsoft.com/zh-cn/platform/support/policy/xamarin?ocid=AID3042760
然后 老的 Win8.1 的 Win App 要升级。。。
唉,咱一个后端还要帮忙兼顾App前端的活儿。。。
先迁移到 UWP ,然后 老的 IE Webview 就可以升级到 Webview2 了!
接着就出了 坑爹的bug,加载大容量的Html 就提示 参数错误。。。
但需求 要在 wv2 上面显示,其中还有可能需要运行 js... 然后 存cookie 什么的...
加载 内存 html模板的 函数 为 NavigateToString
https://learn.microsoft.com/en-us/dotnet/api/microsoft.web.webview2.core.corewebview2.navigatetostring?view=webview2-dotnet-1.0.864.35#remarks
里面提到
The htmlContent parameter may not be larger than 2 MB (2 * 1024 * 1024 bytes) in total size. The origin of the new page is about:blank.
这尼玛 坑了... url 是 about:blank 的话 就不能用 js 操作 cookie 和 localstorage 什么的。
然后 网上查的 解决方案 也没太详细的。
官方也有类似的反馈 https://github.com/MicrosoftEdge/WebView2Feedback/issues/1355
最后反正弄了一套解决方案出来。。。
[C#] 纯文本查看 复制代码 public static class WebView2LargeHtmlExtension
{
/// <summary>
/// htmlTemplate Cache
/// </summary>
static readonly Dictionary<string, string> TemplateCache = new Dictionary<string, string>();
public static async void NavigateToHtml(this WebView2 browser, string template)
{
string key = Guid.NewGuid().ToString();
TemplateCache[key] = template;
browser.Source = new Uri($"https://template/?key={key}");
}
public static void RegLargeHtmlHandler(this CoreWebView2 cwv2)
{
cwv2.AddWebResourceRequestedFilter("https://template/*", CoreWebView2WebResourceContext.All);
cwv2.WebResourceRequested += CoreWebView2_WebResourceRequested_LargeHtmlHandler;
}
private static async void CoreWebView2_WebResourceRequested_LargeHtmlHandler(CoreWebView2 sender, CoreWebView2WebResourceRequestedEventArgs args)
{
string requestUri = args.Request.Uri;
if (requestUri.StartsWith("https://template/"))
{
Deferral def = args.GetDeferral();
try
{
Uri uri = new Uri(requestUri);
NameValueCollection queryString = System.Web.HttpUtility.ParseQueryString(uri.Query);
string headers = $"Content-Type: text/html; charset=utf-8";
if (TemplateCache.Remove(queryString["key"], out string html))
{
InMemoryRandomAccessStream ms = new InMemoryRandomAccessStream();
using (var dataWriter = new DataWriter(ms))
{
dataWriter.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
dataWriter.ByteOrder = ByteOrder.LittleEndian;
dataWriter.WriteString(html);
await dataWriter.StoreAsync();
await dataWriter.FlushAsync();
dataWriter.DetachStream();
ms.Seek(0);
}
args.Response = sender.Environment.CreateWebResourceResponse(ms, 200, "OK", headers);
}
}
catch (Exception)
{
args.Response = sender.Environment.CreateWebResourceResponse(null, 404, "Not found", "");
}
finally
{
def.Complete();
}
}
}
}
private async void Webview2_CoreWebView2Initialized(WebView2 sender, CoreWebView2InitializedEventArgs args)
{
sender.CoreWebView2.RegLargeHtmlHandler();
//other WebView2 CoreWebView2 init code
}
|