Xamarin Forms中WebView Navigating事件对.ashx页面无效求助
我来帮你分析这个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
相关产品推荐
相关产品推荐

