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

如何检测Windows Form C#中WebBrowser Control的超时与会话过期?

检测WebBrowser Control的超时与会话过期(C# Windows Forms)

我来帮你解决C# WinForms里WebBrowser控件的超时检测和会话过期判断问题,这两个场景在实际开发中挺常见的,给你分享几种实用的方案:

一、检测WebBrowser控件是否超时

WebBrowser本身没有内置的超时属性,不过我们可以通过定时器+事件监听的方式来实现超时检测,思路就是监控页面加载的时长,超过设定时间就判定为超时:

  • 第一步,在窗体里定义一个定时器,用来记录加载时间
  • 当WebBrowser开始导航(Navigating事件触发)时,启动定时器
  • 当页面加载完成(DocumentCompleted事件触发)时,停止定时器,说明加载成功
  • 如果定时器触发了Tick事件,就说明加载超时,此时可以停止导航并提示用户

示例代码:

private Timer navigationTimer;

public YourForm()
{
    InitializeComponent();
    // 初始化定时器,设置30秒超时(可根据需求调整)
    navigationTimer = new Timer();
    navigationTimer.Interval = 30000;
    navigationTimer.Tick += NavigationTimer_Tick;
    
    // 绑定WebBrowser的关键事件
    webBrowser1.Navigating += WebBrowser1_Navigating;
    webBrowser1.DocumentCompleted += WebBrowser1_DocumentCompleted;
}

private void WebBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
    // 开始导航时启动定时器
    navigationTimer.Start();
}

private void WebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    // 注意:有些页面会加载子资源(比如图片、脚本),会多次触发这个事件
    // 所以要判断当前完成的URL是否和浏览器当前的URL一致,确保是主文档加载完成
    if (e.Url.Equals(webBrowser1.Url))
    {
        navigationTimer.Stop();
    }
}

private void NavigationTimer_Tick(object sender, EventArgs e)
{
    // 超时触发,停止导航和定时器
    navigationTimer.Stop();
    webBrowser1.Stop();
    MessageBox.Show("网页加载超时,请检查网络或稍后重试!");
}

二、检测当前会话是否过期

会话过期是服务端的逻辑,客户端只能通过页面反馈、Cookie状态或主动测试来判断,以下是几种常用方法:

1. 检查页面内容(最常用)

大多数系统在会话过期后,会跳转到登录页,或者在页面上显示“会话已过期”的提示。我们可以在DocumentCompleted事件里检查页面的内容或URL:

private void WebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if (e.Url.Equals(webBrowser1.Url))
    {
        // 两种判断方式:检查URL是否是登录页,或者检查页面是否包含特定提示文本
        bool isLoginPage = webBrowser1.Document.Url.ToString().Contains("Login.aspx") 
                          || webBrowser1.Document.Url.ToString().Contains("/login");
        bool hasExpiredText = webBrowser1.Document.Body.InnerText.Contains("会话已过期") 
                            || webBrowser1.Document.Body.InnerText.Contains("请重新登录");
        
        if (isLoginPage || hasExpiredText)
        {
            MessageBox.Show("当前会话已过期,请重新登录!");
        }
    }
}

2. 检查会话Cookie

如果服务端用Cookie存储会话标识(比如ASP.NET的ASP.NET_SessionId),可以检查这个Cookie是否存在:

private void CheckSessionValidity()
{
    // 从浏览器Cookie中查找会话标识
    var sessionCookie = webBrowser1.Document.Cookie.Split(';')
        .Select(c => c.Trim())
        .FirstOrDefault(c => c.StartsWith("ASP.NET_SessionId="));
    
    if (string.IsNullOrEmpty(sessionCookie))
    {
        MessageBox.Show("会话可能已过期,会话Cookie不存在!");
    }
    // 注意:即使Cookie存在,也不代表服务端的会话仍然有效,最终还是要以页面反馈为准
}

3. 主动发起会话测试请求

可以让服务端提供一个简单的接口(比如CheckSession.ashx),该接口返回当前会话的状态(比如JSON或纯文本)。然后通过WebBrowser加载这个接口,解析返回内容判断是否过期:

private void TestSessionStatus()
{
    webBrowser1.Navigate("http://your-server/CheckSession.ashx");
}

// 在DocumentCompleted事件里解析接口返回
private void WebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if (e.Url.ToString().Contains("CheckSession.ashx"))
    {
        string response = webBrowser1.Document.Body.InnerText;
        if (response.Equals("SessionExpired"))
        {
            MessageBox.Show("会话已过期!");
        }
        else if (response.Equals("SessionValid"))
        {
            // 会话有效,继续后续操作
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:25:35