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

Xamarin.Android WebView未识别WiFi代理导致加载超时问题求助

解决Xamarin.Android WebView无法识别WiFi代理的问题

我之前做Xamarin.Android项目时也碰到过一模一样的问题——WebView在代理WiFi下死活加载不了,系统Chrome却完全正常,折腾了好一阵才找到几个有效的解决方向,分享给你:

1. 手动获取并设置系统代理配置

WebView有时候不会自动继承系统的代理设置,尤其是一些非全局代理的场景。我们可以主动获取当前WiFi的代理信息,然后手动配置给WebView:

首先要在AndroidManifest.xml里添加权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

然后在代码中获取代理并设置:

var connectivityManager = (ConnectivityManager)GetSystemService(ConnectivityService);
var activeNetwork = connectivityManager.ActiveNetworkInfo;

if (activeNetwork != null && activeNetwork.IsConnected)
{
    var linkProperties = connectivityManager.GetLinkProperties(activeNetwork.Network);
    foreach (var proxyAddr in linkProperties.ProxyAddresses)
    {
        var proxyHost = proxyAddr.HostName;
        var proxyPort = proxyAddr.Port;
        
        if (!string.IsNullOrEmpty(proxyHost) && proxyPort > 0)
        {
            // 针对Android 6.0及以下版本
            if (Build.VERSION.SdkInt <= BuildVersionCodes.M)
            {
                Java.Net.Proxy proxy = new Java.Net.Proxy(Java.Net.Proxy.Type.Http, new InetSocketAddress(proxyHost, proxyPort));
                webView.Settings.SetProxy(proxy);
            }
            // 针对Android 7.0+版本,用ProxyController
            else
            {
                var proxyUri = Uri.Parse($"http://{proxyHost}:{proxyPort}");
                webView.ProxyController.SetProxy(proxyUri, null);
            }
            break;
        }
    }
}

2. 调整WebView的核心设置

有些代理场景下,WebView的默认设置会导致请求失败,你可以尝试调整这些选项:

  • 启用JavaScript(部分代理页面可能依赖):webView.Settings.JavaScriptEnabled = true;
  • 允许混合内容(如果代理涉及HTTP/HTTPS切换):webView.Settings.MixedContentMode = Android.Webkit.MixedContentHandling.AlwaysAllow;
  • 同步Chrome的User-Agent:有些代理服务器会针对不同UA做限制,你可以把WebView的UA改成和你平板Chrome一致的字符串,比如:
    webView.Settings.UserAgentString = "Mozilla/5.0 (Linux; Android 11; SM-T733) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36";
    

3. 自定义WebViewClient拦截请求

如果自动设置代理还是不行,可以尝试通过WebViewClient手动拦截请求,强制走代理:

public class ProxyWebViewClient : WebViewClient
{
    private string _proxyHost;
    private int _proxyPort;

    public ProxyWebViewClient(string proxyHost, int proxyPort)
    {
        _proxyHost = proxyHost;
        _proxyPort = proxyPort;
    }

    public override WebResourceResponse ShouldInterceptRequest(WebView view, IWebResourceRequest request)
    {
        try
        {
            var url = request.Url.ToString();
            var uri = new Uri(url);
            var proxy = new Java.Net.Proxy(Java.Net.Proxy.Type.Http, new InetSocketAddress(_proxyHost, _proxyPort));
            
            var urlConnection = (HttpURLConnection)uri.ToURL().OpenConnection(proxy);
            urlConnection.RequestMethod = request.Method;
            
            // 复制原请求的Header
            foreach (var header in request.RequestHeaders)
            {
                urlConnection.SetRequestProperty(header.Key, header.Value);
            }

            return new WebResourceResponse(
                urlConnection.ContentType,
                urlConnection.ContentEncoding,
                urlConnection.InputStream
            );
        }
        catch (Exception ex)
        {
            // 出错时回退到默认处理
            return base.ShouldInterceptRequest(view, request);
        }
    }

    // 如果代理需要认证,重写这个方法
    public override void OnReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, string host, string realm)
    {
        handler.Proceed("你的代理用户名", "你的代理密码");
    }
}

然后把这个自定义Client设置给WebView:

// 这里的proxyHost和proxyPort可以从前面获取的系统代理信息中拿到
webView.SetWebViewClient(new ProxyWebViewClient(proxyHost, proxyPort));

4. 排查代理认证与WebView内核版本

  • 如果你的代理需要用户名密码,一定要记得处理OnReceivedHttpAuthRequest,WebView默认不会弹出认证窗口;
  • 尝试更新设备上的Chrome浏览器——因为Android的WebView内核和Chrome共享,旧版本的内核可能存在代理兼容Bug。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:24:43