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

如何在Xamarin Forms中实现无网络连接的全局处理

自定义导航服务封装(通用MVVM场景首选)

你用MVVM模式一般都会封装独立的INavigationService做页面跳转控制,直接把网络检查逻辑内嵌到导航方法中即可,完全避免重复代码:

  • 统一在导航方法Task NavigateToAsync(string pageKey, object parameter = null)中先调用Xamarin.Essentials的Connectivity.NetworkAccess判断网络状态
  • 无网络时直接弹出全局提示(可调用Application.Current.MainPage.DisplayAlert或自定义Toast组件),终止后续导航逻辑
  • 网络正常时再执行原本的页面跳转逻辑
  • 所有视图模型统一调用该导航服务做跳转,无需单独处理网络校验

Shell路由拦截(Shell项目首选)

如果你的项目用Xamarin.Forms Shell做路由管理,直接重写Shell的OnNavigating方法拦截所有导航请求即可,零业务代码侵入:

protected override void OnNavigating(ShellNavigatingEventArgs args)
{
    base.OnNavigating(args);
    // 过滤掉后退、弹窗等不需要检查网络的导航行为
    if (args.Source is ShellNavigationSource.Push or ShellNavigationSource.PushAsync)
    {
        if (Connectivity.NetworkAccess != NetworkAccess.Internet)
        {
            args.Cancel();
            // 主线程弹提示避免UI异常
            MainThread.BeginInvokeOnMainThread(async () => 
            {
                await DisplayAlert("提示", "当前无可用网络,请检查网络设置后重试", "确定");
            });
        }
    }
}

基类视图模型通用方法封装

如果部分非导航场景也需要校验网络,可以把通用逻辑写到所有视图模型继承的BaseViewModel中:

  • 在基类中实现bool CheckNetworkAvailable()方法,内部包含网络状态判断、无网络提示逻辑,直接返回网络是否可用
  • 业务代码中需要校验网络的位置只需要加一行if (!CheckNetworkAvailable()) return;即可,无需重复写判断和提示逻辑

HttpClient全局异常拦截(请求场景兜底)

如果无网络报错主要出现在API请求阶段,可以给HttpClient加自定义委托处理器,统一捕获无网络异常并弹提示,无需每个接口单独处理:

public class NetworkExceptionHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        try
        {
            return await base.SendAsync(request, cancellationToken);
        }
        catch (HttpRequestException ex) when (Connectivity.NetworkAccess != NetworkAccess.Internet 
            || ex.InnerException is WebException { Status: WebExceptionStatus.ConnectFailure })
        {
            MainThread.BeginInvokeOnMainThread(async () =>
            {
                await Application.Current.MainPage.DisplayAlert("网络错误", "网络连接失败,请检查网络后重试", "确定");
            });
            // 可根据业务需求选择抛出异常或返回自定义错误响应
            throw;
        }
    }
}

使用时将处理器添加到HttpClient构造链即可:
var client = new HttpClient(new NetworkExceptionHandler { InnerHandler = new HttpClientHandler() });


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:36:03