非WinJS环境下,UWP托管式JS应用如何处理未配置Content URI的404错误?
嘿,我来帮你搞定这个在非WinJS的UWP应用里处理未列入Content URI的URI 404错误的问题!
首先得先弄明白核心原因:当你把域名加到appxManifest->Content URI区域时,UWP会把这些URI标记为可信来源,WebView会自动调用内置的msapp-error.html来处理加载错误;但对于没在这个列表里的URI,出于安全限制,WebView不会暴露详细错误信息,也不会触发默认错误页面,就导致应用看起来“毫无反应”。
下面给你几个实用的解决方案,你可以根据自己的应用场景选:
处理未列入Content URI的URI 404错误的方法
方法1:监听WebView的NavigationFailed事件直接捕获错误
如果你是用WebView控件加载URI,这是最直接的办法——手动捕获导航失败事件,自己处理404。
具体步骤:
- 在XAML里给WebView绑定事件:
<WebView x:Name="MyWebView" NavigationFailed="MyWebView_NavigationFailed"/>
- 在代码后台(以C#为例)写处理逻辑:
private void MyWebView_NavigationFailed(object sender, WebViewNavigationFailedEventArgs e) { // 先判断是不是404错误 if (e.WebErrorStatus == WebErrorStatus.HttpNotFound) { // 这里可以自定义处理:比如显示一段提示HTML,或者跳转到你的本地错误页面 MyWebView.NavigateToString("<html><body><h2>哎呀,页面找不到啦(404)</h2></body></html>"); // 也可以导航到本地的自定义错误页 // MyWebView.Navigate(new Uri("ms-appx-web:///Assets/Custom404.html")); } else { // 其他加载错误也可以统一处理 MyWebView.NavigateToString($"<html><body><h2>加载失败:{e.WebErrorStatus}</h2></body></html>"); } }
这个方法不用改Content URI列表,直接在代码层搞定所有WebView的导航失败情况,包括那些未列入可信列表的URI。
方法2:注入JavaScript拦截页面内的404错误
如果你的WebView加载的是自己能控制的网页,可以注入JS代码,捕获页面里的资源加载失败、AJAX请求失败这类404,再通知UWP应用处理。
具体步骤:
- 在WebView的
NavigationCompleted事件里注入JS:
private void MyWebView_NavigationCompleted(object sender, WebViewNavigationCompletedEventArgs e) { if (e.IsSuccess) { string errorCaptureScript = @" // 捕获页面里的资源(图片、脚本、样式)加载失败 window.addEventListener('error', function(event) { const targetTags = ['IMG', 'SCRIPT', 'LINK']; if (targetTags.includes(event.target.tagName)) { const errorInfo = `资源加载失败:${event.target.src}(疑似404)`; window.external.notify(errorInfo); } }); // 捕获fetch请求的404错误 const originalFetch = window.fetch; window.fetch = function(url, options) { return originalFetch(url, options) .then(response => { if (!response.ok && response.status === 404) { window.external.notify(`请求404:${url}`); } return response; }) .catch(err => { window.external.notify(`请求出错:${err.message}`); throw err; }); }; "; MyWebView.InvokeScriptAsync("eval", new[] { errorCaptureScript }); } }
- 监听WebView的
ScriptNotify事件,接收前端传来的错误信息并处理:
private void MyWebView_ScriptNotify(object sender, NotifyEventArgs e) { // 这里可以把错误信息打日志,或者给用户显示提示 Debug.WriteLine("前端错误通知:" + e.Value); // 比如弹出对话框更新UI之类的 }
这个方法适合处理页面内部的资源或请求404,而不只是主页面的导航失败。
方法3:添加Content URI并限制权限(折中方案)
如果你还是想用上msapp-error.html的自动处理,但又不想给太多权限,可以在添加域名到Content URI时,把权限设到最小:
- 打开
Package.appxmanifest,切换到“内容URI”选项卡; - 添加目标域名,然后在“权限”下拉菜单里选最低必要的权限(比如
Script或者None,别选All); - 这样既能让WebView触发默认错误页面,又能尽量降低安全风险。
小提醒:
- 对于完全不可信的外部URI,不建议加到Content URI列表里,优先用方法1或2;
WebErrorStatus枚举里有各种错误类型,除了HttpNotFound,还有连接失败、超时这些,你可以根据需求扩展处理逻辑。
内容的提问来源于stack exchange,提问作者Mahesh
相关产品推荐
相关产品推荐

