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

VB.Net实现服务器错误时自动重载网页的方法

当然有可行的方案!我来给你拆解具体怎么实现——核心思路是监听浏览器控件的错误/加载完成事件,判断是否属于你关注的「页面超时」「服务器繁忙」这类错误,然后触发弹窗提示+自动刷新的逻辑。下面分不同技术栈给你具体的实现步骤和代码示例:

方案一:C# WinForms/WPF 桌面浏览器实现

如果你是用.NET的WinForms或WPF开发桌面浏览器,核心是通过监听页面加载事件,获取HTTP响应状态码或者捕获加载异常,进而触发逻辑:

WinForms 具体实现

  1. 首先在窗体初始化时绑定DocumentCompleted事件:
public Form1()
{
    InitializeComponent();
    webBrowser1.DocumentCompleted += webBrowser1_DocumentCompleted;
}
  1. 在事件处理方法中判断错误类型并执行弹窗+刷新:
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    // 通过HEAD请求获取HTTP状态码(避免重复加载页面内容)
    var webRequest = (HttpWebRequest)WebRequest.Create(e.Url);
    webRequest.Method = "HEAD";
    try
    {
        using (var webResponse = (HttpWebResponse)webRequest.GetResponse())
        {
            var statusCode = (int)webResponse.StatusCode;
            // 匹配目标错误:408请求超时、503服务不可用、504网关超时
            if (statusCode == 408 || statusCode == 503 || statusCode == 504)
            {
                // 弹窗提示
                MessageBox.Show($"访问出错:{webResponse.StatusDescription}\n即将自动重试", "服务器错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                // 延迟1秒后刷新(给服务器缓冲时间)
                Task.Delay(1000).ContinueWith(_ => 
                {
                    // WinForms跨线程操作UI需用Invoke
                    this.Invoke((Action)(() => webBrowser1.Refresh()));
                });
            }
        }
    }
    catch (WebException ex)
    {
        // 捕获网络超时、服务器异常等情况
        if (ex.Status == WebExceptionStatus.Timeout || ex.Status == WebExceptionStatus.ServerProtocolViolation)
        {
            MessageBox.Show($"页面响应超时或服务器异常:{ex.Message}\n即将自动重试", "访问错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            Task.Delay(1000).ContinueWith(_ => 
            {
                this.Invoke((Action)(() => webBrowser1.Refresh()));
            });
        }
    }
}

WPF 具体实现

WPF的WebBrowser控件用LoadCompleted事件,逻辑类似:

private void webBrowser_LoadCompleted(object sender, NavigationEventArgs e)
{
    var browser = sender as WebBrowser;
    if (browser == null) return;

    try
    {
        var request = (HttpWebRequest)WebRequest.Create(e.Uri);
        request.Method = "HEAD";
        using (var response = (HttpWebResponse)request.GetResponse())
        {
            var statusCode = (int)response.StatusCode;
            if (statusCode is 408 or 503 or 504)
            {
                MessageBox.Show($"访问出错:{response.StatusDescription}\n即将自动重试", "服务器错误", MessageBoxButton.OK, MessageBoxImage.Error);
                Task.Delay(1000).ContinueWith(_ =>
                {
                    // WPF用Dispatcher处理跨线程UI操作
                    Dispatcher.Invoke(() => browser.Refresh());
                });
            }
        }
    }
    catch (WebException ex)
    {
        if (ex.Status == WebExceptionStatus.Timeout || ex.Status == WebExceptionStatus.ServerProtocolViolation)
        {
            MessageBox.Show($"页面响应超时或服务器异常:{ex.Message}\n即将自动重试", "访问错误", MessageBoxButton.OK, MessageBoxImage.Error);
            Task.Delay(1000).ContinueWith(_ =>
            {
                Dispatcher.Invoke(() => browser.Refresh());
            });
        }
    }
}
方案二:Electron 跨平台浏览器实现

如果是用Electron开发跨平台浏览器,可以监听webContents的加载失败事件:

const { app, BrowserWindow, dialog } = require('electron');
let mainWindow;
let retryCount = 0; // 限制重试次数,避免无限刷新

function createWindow() {
  mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true,
      contextIsolation: false
    }
  });

  // 监听页面加载失败事件
  mainWindow.webContents.on('did-fail-load', (event, errorCode, errorDescription, validatedURL) => {
    // 匹配错误码:ERR_CONNECTION_TIMED_OUT(-101)、ERR_SERVICE_UNAVAILABLE(-2)
    if ((errorCode === -101 || errorCode === -2) && retryCount < 3) {
      dialog.showErrorBox('服务器错误', `访问出错:${errorDescription}\n即将自动重试(剩余${2 - retryCount}次)`);
      retryCount++;
      // 延迟1.5秒后刷新
      setTimeout(() => {
        mainWindow.webContents.reload();
      }, 1500);
    } else if (retryCount >=3) {
      dialog.showErrorBox('重试失败', '已尝试3次仍无法访问,请稍后再试');
    }
  });

  mainWindow.loadURL('https://你的目标网站.com');
}

app.whenReady().then(createWindow);
关键注意事项
  • 避免无限刷新:一定要加重试次数限制(比如最多3次),防止服务器一直不可用时程序陷入死循环
  • 延迟重试:不要立刻刷新,给服务器1-3秒的缓冲恢复时间,避免加重服务器负担
  • 错误判断准确性:不同平台/控件的错误码、状态码可能有差异,需要根据实际测试调整判断条件
  • 线程安全:在WinForms/WPF中,跨线程操作UI控件必须用Invoke或Dispatcher.Invoke,否则会抛出异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:05:44