You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非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。

具体步骤:

  1. 在XAML里给WebView绑定事件:
<WebView x:Name="MyWebView" NavigationFailed="MyWebView_NavigationFailed"/>
  1. 在代码后台(以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应用处理。

具体步骤:

  1. 在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 });
    }
}
  1. 监听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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:45:38