UWP 中 Webview2 支持请求 超过2M 的 html模板
本帖最后由 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
最后反正弄了一套解决方案出来。。。
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 = 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
}
Xamarin没了,.net怎么开发移动端App? Pojie1999.0909 发表于 2023-5-22 14:27
Xamarin没了,.net怎么开发移动端App?
说是让迁移到 移动端的 .Net SDK 而不用 Xamarin SDK 了
不过我这边 协助 win 上面的 App 迁移。 所以先到UWP pjy612 发表于 2023-5-22 15:33
说是让迁移到 移动端的 .Net SDK 而不用 Xamarin SDK 了
不过我这边 协助 win 上面的 App 迁移。 所以 ...
后面跨平台低端的app开发估计也会逐渐被大厂慢慢取代
微软的 MAUI
谷歌的 Flutter
这两年 Reactive Native也好也不如前几年了
BTW,今天偶尔看到fiddle enhance那个仓库 。。。。 本帖最后由 pjy612 于 2023-5-29 13:06 编辑
glionying 发表于 2023-5-29 12:39
后面跨平台低端的app开发估计也会逐渐被大厂慢慢取代
微软的 MAUI
谷歌的 Flutter
BTW 是啥?
本来是计划迁移到 MAUI 但是 MAUI 的 基础控件 支持太差了。。。 得再观望下。。。
UWP 至少算是 平滑迁移 改动比较下。。。 顺便熟悉下 Webview2 反正 最终还得用这。
PS. fildder 那个啊? fork 了 原作者的 然后 顺带多研究了下。(不过原作者似乎不更了 pjy612 发表于 2023-5-29 13:04
BTW 是啥?
本来是计划迁移到 MAUI 但是 MAUI 的 基础控件 支持太差了。。。 得再观望下。。。
BTW = By the way
Net控件做的好的有Devexpress, Telerik, Syncfusion
它们都有net各平台的常用的控件,包括MAUI,可以关注下 glionying 发表于 2023-5-29 15:16
BTW = By the way
Net控件做的好的有Devexpress, Telerik, Syncfusion
它们都有net各平台的常用的控件 ...
毕竟是公司项目,商用组件 不能随便用。
另外迁移还要保证风格统一
Xamarin 迁移到 UWP 多少还统一点。
直接迁移 MAUI 很多东西 没有基础支持 可能还得自己画控件。
所以 前端同事 觉得 短期内还是 迁移到 UWP 比较快。
{:301_995:}
页:
[1]