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

Xamarin Forms中WebView Navigating事件对.ashx页面无效求助

解决Xamarin.Forms WebView SSO重定向后Navigating事件不触发的问题

我来帮你分析这个WebView在SSO流程中后续重定向不触发Navigating事件的问题,结合实际开发中的类似场景,给你几个排查和解决的方向:

1. 检查Navigating事件的处理逻辑,避免误取消导航

首先先确认你在处理redirect_uri页面的Navigating事件时,有没有不小心设置了e.Cancel = true——如果在这个步骤终止了导航,后续的重定向自然不会触发事件。建议先在事件里打印所有导航的URL,确认是否真的没捕获到:

private void WebView_Navigating(object sender, WebNavigatingEventArgs e)
{
    Console.WriteLine($"当前导航URL: {e.Url}");
    // 只在你明确需要拦截的URL上设置Cancel,比如拿到Token后终止导航
    if (e.Url.Contains("blank.html?JWTTOken"))
    {
        // 这里处理JWT Token的提取逻辑
        e.Cancel = true; // 只有在拿到Token后再取消导航
    }
}

2. 确保WebView允许JS执行和重定向

如果你的SSOHandler.ashx是通过客户端JavaScript(比如window.location.href)重定向到blank.html,那必须确保WebView启用了JavaScript,否则JS重定向不会生效,自然也不会触发Navigating事件:

  • 针对Android,可以自定义WebViewRenderer开启JS和重定向允许:
[assembly: ExportRenderer(typeof(WebView), typeof(CustomWebViewRenderer))]
namespace YourApp.Droid
{
    public class CustomWebViewRenderer : WebViewRenderer
    {
        public CustomWebViewRenderer(Context context) : base(context) { }

        protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
        {
            base.OnElementChanged(e);
            if (Control != null)
            {
                Control.Settings.JavaScriptEnabled = true;
                Control.Settings.AllowRedirects = true;
            }
        }
    }
}
  • iOS的WKWebView默认允许JS和重定向,但如果自定义了导航代理,要确保在DecidePolicy方法里允许导航:
[assembly: ExportRenderer(typeof(WebView), typeof(CustomWebViewRenderer))]
namespace YourApp.iOS
{
    public class CustomWebViewRenderer : WkWebViewRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
        {
            base.OnElementChanged(e);
            if (Configuration != null)
            {
                Configuration.UserContentController = new WKUserContentController();
                NavigationDelegate = new CustomNavigationDelegate();
            }
        }
    }

    public class CustomNavigationDelegate : WKNavigationDelegate
    {
        public override void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction, Action<WKNavigationActionPolicy> decisionHandler)
        {
            Console.WriteLine($"iOS原生导航URL: {navigationAction.Request.Url}");
            decisionHandler(WKNavigationActionPolicy.Allow); // 必须允许导航才能触发后续事件
        }
    }
}

3. 验证重定向URL的编码正确性

JWT Token里可能包含#、&这类特殊字符,如果SSOHandler.ashx在重定向时没有对JWT参数做URL编码,可能导致WebView无法正确解析这个URL,进而跳过导航事件。确保重定向的URL是经过编码的,比如:

// 在SSOHandler.ashx中重定向时对JWT参数编码
string encodedToken = HttpUtility.UrlEncode(jwtToken);
Response.Redirect($"blank.html?JWTTOken={encodedToken}");

4. 用Navigated事件辅助排查

如果Navigating事件没触发,可以同时监听WebView的Navigated事件,看看blank.html的URL是否有加载完成。如果Navigated能捕获到,说明导航已经发生,但Navigating事件因为某些原因没触发,这时候可以考虑在Navigated里处理Token提取,或者排查事件绑定是否有问题。

5. 用原生WebView导航事件兜底

如果以上方法都不行,可以直接监听原生WebView的导航事件,这样能捕获所有层级的重定向:

  • Android的ShouldOverrideUrlLoading方法可以捕获所有URL请求;
  • iOS的WKNavigationDelegate的DecidePolicy方法能拦截所有导航动作。
    通过原生事件,你可以更精准地控制导航流程,避免Xamarin.Forms封装层的限制。

内容的提问来源于stack exchange,提问作者Ankur Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:17:07