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

Xamarin.Forms Android WebView ShouldOverrideUrlLoading获取RequestHeaders为null问题

问题原因

Android 系统原生设计中,ShouldOverrideUrlLoading 回调返回的 IWebResourceRequest 实例的 RequestHeaders 属性默认返回 null,这不是配置错误导致的:

  • 只有资源加载类回调 ShouldInterceptRequest 中,该属性才会被系统赋值
  • 你通过 LoadUrl 传入的自定义请求头已经被 WebView 底层接收并发送给服务端,只是没有被回传到 ShouldOverrideUrlLoading 的参数中

解决方案

方案1:直接读取本地存储的自定义头

你添加的是固定的应用版本自定义头,不需要从请求中取,直接在 ShouldOverrideUrlLoading 中访问你定义的 Constants.AppVersion 即可,或者在添加请求头时将自定义头存入全局可访问的静态变量/服务,需要时直接读取即可,兼容性最好。

方案2:强制转换为原生对象读取

和iOS的强制转型逻辑一致,将跨平台封装的 IWebResourceRequest 转为安卓原生 WebResourceRequest 即可读取请求头,注意该方法存在ROM兼容性风险,部分定制系统可能无法获取:

public override bool ShouldOverrideUrlLoading(Android.Webkit.WebView webView, IWebResourceRequest request)
{
    if (request is Android.Webkit.WebResourceRequest nativeRequest)
    {
        var headers = nativeRequest.RequestHeaders;
        // 此处处理请求头逻辑
    }
    // 原有逻辑
    return base.ShouldOverrideUrlLoading(webView, request);
}

方案3:换用ShouldInterceptRequest回调处理

如果需要获取所有请求的完整请求头,改用资源拦截回调即可,该回调的参数中RequestHeaders默认有值:

public override WebResourceResponse ShouldInterceptRequest(Android.Webkit.WebView view, IWebResourceRequest request)
{
    var headers = request.RequestHeaders;
    // 处理请求头逻辑
    return base.ShouldInterceptRequest(view, request);
}

注意事项

如果是WebView内部3xx跳转触发的ShouldOverrideUrlLoading,即使转成原生对象请求头也可能为空,这是安卓系统底层限制,没有修复方案,建议优先使用方案1处理自定义请求头的读取。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 03:27:03