C# WebBrowser如何在主窗口顶部展示HTTP响应状态码及网页标题 附代码求解释
实现C# WebBrowser顶部展示HTTP响应状态码与网页标题的方案
首先要调整窗口布局,以WinForm场景为例:
- 在WebBrowser控件上方新增Panel或ToolStrip容器,放入两个Label控件分别用来展示状态码和网页标题
- 状态码获取有两种可选方案:一是提前用HttpWebRequest发起请求拿到状态码后,再将返回的HTML内容通过
WebBrowser.DocumentText赋值加载,这种方式实现简单适合普通场景;二是扩展WebBrowser的COM接口直接捕获控件自身请求的响应头,适合需要完全复用控件请求逻辑的场景 - 网页标题可以直接在WebBrowser的
DocumentCompleted事件触发后,读取WebBrowser.DocumentTitle属性获取
参考实现代码:
// 窗体中提前定义两个Label:lblStatusCode展示状态码,lblTitle展示网页标题 private async void NavigateToUrl(string url) { try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); using (HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync()) { // 顶部展示响应状态码 lblStatusCode.Text = $"HTTP状态:{(int)response.StatusCode} {response.StatusDescription}"; if (response.StatusCode == HttpStatusCode.OK) { StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(response.CharacterSet ?? "UTF-8")); string htmlContent = reader.ReadToEnd(); // 加载页面到WebBrowser控件 webBrowser1.DocumentText = htmlContent; // 文档加载完成后读取并展示标题 webBrowser1.DocumentCompleted += (s, e) => { lblTitle.Text = $"网页标题:{webBrowser1.DocumentTitle}"; }; } } } catch (WebException ex) { if (ex.Response is HttpWebResponse errResp) { lblStatusCode.Text = $"HTTP状态:{(int)errResp.StatusCode} {errResp.StatusDescription}"; } else { lblStatusCode.Text = "HTTP状态:请求失败"; } } }
适用场景:自定义浏览器工具、网页可用性测试工具、爬虫可视化工具等需要直观展示页面加载状态的场景。
提供的C#代码解释
这段代码是基于HttpWebRequest实现HTTP GET请求、读取响应内容的基础示例,逐段逻辑说明如下:
// 定义目标请求的URL地址 string urlAddress = "http://google.com"; // 初始化HTTP请求实例 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlAddress); // 发起同步HTTP请求,获取服务端返回的响应对象 HttpWebResponse response = (HttpWebResponse)request.GetResponse(); // 判断响应状态码是否为200 OK,即请求是否成功 if (response.StatusCode == HttpStatusCode.OK) { // 获取响应内容的字节流 Stream receiveStream = response.GetResponseStream(); StreamReader readStream = null; // 判断响应头中是否指定了字符编码 if (response.CharacterSet == null) { // 未指定编码则用系统默认编码创建流读取器 readStream = new StreamReader(receiveStream); } else { // 按响应指定的编码创建流读取器,避免出现乱码 readStream = new StreamReader(receiveStream, Encoding.GetEncoding(response.CharacterSet)); } // 读取整个响应流的内容,得到完整的HTML字符串 string data = readStream.ReadToEnd(); // 手动关闭资源 response.Close(); readStream.Close(); }
这段代码的可优化点:
- 没有异常捕获逻辑,出现404、500、请求超时等错误时会直接抛出异常
- 资源释放不规范,应该用
using语句自动释放资源,不需要手动调用Close方法 - 是同步请求,会阻塞UI线程,桌面端项目建议替换为异步的
GetResponseAsync方法
内容的提问来源于stack exchange,提问作者rubans3456
相关产品推荐
相关产品推荐

