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

Xamarin.Android中VPN失效时Flurl Http调用出现未处理异常

解决Flurl在VPN断开时的未处理异常及获取响应StatusCode的方案

一、处理VPN断开时的未处理异常

从你给出的异常栈来看,VPN断开后请求无法抵达目标服务器,最终触发了被FlurlHttpException包裹的TaskCanceledException。要避免未处理异常崩溃,你需要给Flurl请求添加针对性的异常捕获逻辑,同时可以合理设置超时时间来快速感知连接问题:

  1. 针对性捕获异常
    直接捕获FlurlHttpException,判断内部异常是否为TaskCanceledException,就能精准处理VPN断开这类连接失败场景:
try
{
    var result = await "http://192.168.110.60/TestServices/MyCall.aspx"
        .SetQueryParams(new { method = "Test", username = "abc", password = "abc" })
        .WithTimeout(10) // 设置10秒超时,避免长时间等待无响应
        .ReceiveString();
}
catch (FlurlHttpException ex)
{
    if (ex.InnerException is TaskCanceledException)
    {
        // 这里处理VPN断开/网络无法连接的情况,比如提示用户检查网络状态
        Console.WriteLine("网络连接异常,请检查VPN是否正常开启");
    }
    else
    {
        // 处理其他Flurl相关异常,比如HTTP 4xx/5xx错误
        Console.WriteLine($"请求出错:{ex.Message}");
    }
}
catch (Exception ex)
{
    // 兜底捕获其他非Flurl类异常
    Console.WriteLine($"未知错误:{ex.Message}");
}
  1. 全局异常处理(可选)
    如果应用内有大量Flurl请求,你可以注册全局错误处理逻辑,避免每个请求都重复写捕获代码:
FlurlHttp.Configure(settings =>
{
    settings.OnErrorAsync = call =>
    {
        if (call.Exception.InnerException is TaskCanceledException)
        {
            // 全局统一处理连接超时/断开的情况
            Console.WriteLine("全局提示:当前网络连接异常,请检查VPN");
        }
        return Task.CompletedTask;
    };
});

二、获取响应的StatusCode

不管请求成功还是失败(服务器有返回的情况下),你都能通过Flurl拿到响应的StatusCode:

  1. 请求成功时获取
    先调用.GetAsync()拿到HttpResponseMessage,再读取StatusCode:
var response = await "http://192.168.110.60/TestServices/MyCall.aspx"
    .SetQueryParams(new { method = "Test", username = "abc", password = "abc" })
    .GetAsync();

int statusCode = (int)response.StatusCode; // 成功时会拿到200
var result = await response.ReceiveString();
  1. 请求失败时从异常中获取
    当请求抛出FlurlHttpException时,异常的Response属性包含服务器返回的响应信息(如果请求抵达了服务器):
catch (FlurlHttpException ex)
{
    if (ex.Response != null)
    {
        int statusCode = (int)ex.Response.StatusCode;
        Console.WriteLine($"请求返回错误码:{statusCode}");
    }
    // 其他异常处理逻辑...
}

注意:如果是VPN断开导致请求完全无法抵达服务器,ex.Response会是null,这种情况下没有StatusCode可以获取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:50:54