新闻详情

新闻详情

首页 / 资讯中心 / 详情

Electron.NET 请求拦截实战:用 WebRequest 拦截与改写 HTTP 请求

发布时间:2026/9/28 3:37:45来源:尧图网络
Electron.NET 请求拦截实战:用 WebRequest 拦截与改写 HTTP 请求
桌面应用跨平台【免费下载链接】Electron.NET:electron: Build cross platform desktop apps with ASP.NET Core (Razor Pages, MVC, Blazor).项目地址https://gitcode.com/gh_mirrors/el/Electron.NET点击查看免费下载导读WebRequest是 Electron 会话Session提供的请求级拦截 API允许你在请求生命周期的各个阶段监听、修改甚至取消网络请求。本文以 docs/API 体系下的 WebRequest 文档 为骨架结合 Electron.NET 仓库的 C# 封装与 Electron Host 端 TypeScript 实现带你掌握过滤器filter的 URL 匹配规则、8 个生命周期事件的触发时机与回调参数并给出可直接落地的 C# 示例如改写User-Agent、取消广告请求、重定向域名帮助你为基于 ASP.NET Core 的桌面应用实现代理、调试与安全控制。一、认识 WebRequest拦截并改写请求的生命周期WebRequest类用于在请求生命周期的各个阶段拦截并修改请求内容Intercept and modify the contents of a request at various stages of its lifetime。在 Electron 架构中它运行在主进程Main Process并且不会从electron模块中导出——只能通过Session对象的webRequest属性访问。这一点在 Electron.NET 中同样成立C# 侧的WebRequest实例由Session创建并暴露见 Session.cspublic WebRequest WebRequest { get; private set; } internal Session(int id) { Id id; Cookies new Cookies(id); WebRequest new WebRequest(id); }而从WebContents到Session的链路为WebContents内部维护Session属性见 WebContents.csinternal WebContents(int id) { Id id; Session new Session(id); }也就是说在 Electron.NET 中通过BrowserWindow/WebContents的Session属性即可拿到WebRequest进而注册拦截逻辑。1.1 统一的调用范式filter listenerWebRequest的所有方法都接受一个可选的filter过滤器和一个listener监听器filter包含一个urls数组URL 模式列表用于过滤掉不匹配的请求如果省略filter则匹配所有请求。listener当事件发生时被调用形式为listener(details)其中details描述该请求。部分事件如onBeforeRequest、onBeforeSendHeaders、onHeadersReceived的listener还会收到一个callback需要在处理完成后以response对象调用它。⚠️关键约束只有最后一个附着的listener会被使用。向listener传入null即可取消订阅该事件。1.2 一次最经典的拦截改写User-Agent官方文档给出的第一个示例就是为特定 URL 的请求改写User-Agent请求头const { session } require(electron) // Modify the user agent for all requests to the following urls. const filter { urls: [https://*.github.com/*, *://electron.github.io/*] } session.defaultSession.webRequest.onBeforeSendHeaders(filter, (details, callback) { details.requestHeaders[User-Agent] MyAgent callback({ requestHeaders: details.requestHeaders }) })这段代码说明了两点核心用法filter.urls决定哪些请求会被捕获onBeforeSendHeaders允许修改即将发送的请求头然后通过callback把新的requestHeaders返回给 Electron 继续发送请求。二、过滤器 filterURL 模式匹配规则filter对象只有urls一个属性值为 URL 模式pattern的数组。Electron 使用 Chromium 的 URL 匹配模式语法官方文档给出以下合法示例http://foo:1234/ // 精确匹配协议、主机与端口 http://foo.com/ // 精确匹配主机 http://foo:1234/bar // 精确路径 *://*/* // 匹配任意协议、任意主机、任意路径即全部请求 *://example.com/* // 匹配 example.com 下的所有请求 *://example.com/foo/* // 匹配 example.com/foo/ 路径前缀 http://*.foo:1234/ // 匹配 foo 的任意子域*.foo file://foo:1234/bar // 也支持 file:// 协议 http://foo:*/ // 通配端口 *://www.foo.com/ // 通配协议但限定主机要点归纳语法要素含义*://匹配任意协议http/https/ws/file 等*.domain匹配该域名的任意子域*作为路径匹配任意路径:*/匹配任意端口file://对本地file://请求同样生效三、8 个请求生命周期事件WebRequest实例方法全部遵循webRequest.onXxx([filter, ]listener)签名。下表汇总了 8 个事件的触发时机与回调能力方法触发时机回调能力onBeforeRequest请求即将发生时可取消cancel或重定向redirectURLonBeforeSendHeaders请求头可用、尚未发送任何 HTTP 数据时可取消或改写requestHeadersonSendHeaders请求即将发送给服务器时只读无仅观察onHeadersReceived收到 HTTP 响应头时可取消或改写responseHeaders、statusLineonResponseStarted响应体第一个字节到达时只读无仅观察onBeforeRedirect服务器发起的重定向即将发生时只读无仅观察onCompleted请求完成时只读无仅观察onErrorOccurred请求发生错误时只读无仅观察下面逐一展开每个事件。3.1webRequest.onBeforeRequest([filter, ]listener)请求即将发生时触发是拦截能力最强的事件之一。details对象字段idInteger请求唯一标识urlstring请求 URLmethodstringHTTP 方法webContentsIdInteger可选发起请求的 WebContents 标识webContentsWebContents可选frameWebFrameMain可选请求所在的 FrameresourceTypestring资源类型取值可为mainFrame、subFrame、stylesheet、script、image、font、object、xhr、ping、cspReport、media、webSocket或otherreferrerstring来源页timestampDouble时间戳uploadData[UploadData[]]上传数据数组例如 POST bodycallback的response对象cancelboolean可选设为true则取消该请求redirectURLstring可选阻止原请求发送/完成改为重定向到给定 URL应用场景拦截广告请求、阻止危险域名、将特定资源重定向到本地缓存/代理。3.2webRequest.onBeforeSendHeaders([filter, ]listener)在发送 HTTP 请求之前、请求头可用时触发。此时可能已建立 TCP 连接但尚未发送任何 HTTP 数据。details在onBeforeRequest的基础上额外包含requestHeadersRecordstring, string即将发送的请求头callback的beforeSendResponse对象cancelboolean可选requestHeadersRecordstring, string | string[]可选提供该字段时请求将携带这些请求头发送应用场景改写 User-Agent、注入认证 Token、统一添加自定义请求头即 1.2 节示例。3.3webRequest.onSendHeaders([filter, ]listener)在请求即将发送给服务器之前触发。此时前一个onBeforeSendHeaders的修改结果已经可见。details包含requestHeaders但没有callback只能观察、不能修改。应用场景最终确认发送的请求头集合用于日志与审计。3.4webRequest.onHeadersReceived([filter, ]listener)当 HTTP响应头被收到时触发。details在基础字段外包含statusLinestring状态行如HTTP/1.1 200 OKstatusCodeInteger状态码responseHeadersRecordstring, string[]可选响应头callback的headersReceivedResponse对象cancelboolean可选responseHeadersRecordstring, string | string[]可选提供该字段时服务器被视为以这些头响应statusLinestring可选改写responseHeaders时应同时提供用于修改状态行否则沿用原响应头的状态应用场景改写响应头如 CSP、X-Frame-Options、跨域头、修正错误的状态码。3.5webRequest.onResponseStarted([filter, ]listener)当响应体第一个字节到达时触发。对 HTTP 请求而言此时状态行和响应头已经可用。details包含responseHeaders、fromCache是否来自磁盘缓存、statusCode、statusLine。应用场景记录响应开始时间与状态做性能埋点。3.6webRequest.onBeforeRedirect([filter, ]listener)当服务器发起的重定向即将发生时触发。details额外包含redirectURLstring重定向目标statusCode、statusLine重定向响应信息ipstring可选请求实际发送到的服务器 IPfromCachebooleanresponseHeaders可选应用场景追踪 3xx 跳转链、发现盗链与劫持。3.7webRequest.onCompleted([filter, ]listener)当请求完成时触发。details包含responseHeaders、fromCache、statusCode、statusLine以及errorstring错误描述。应用场景请求成功率统计、耗时汇总。3.8webRequest.onErrorOccurred([filter, ]listener)当错误发生时触发。details包含fromCache与errorstring错误描述。应用场景全局错误监控与上报。四、Electron.NET 中的 C# 用法文档本身给出的是原生 Electron JS 调用方式。在 Electron.NET 中这些能力通过 C# 封装暴露。下面说明当前仓库中的实现状态与可用的 C# 写法。4.1 从 Session 拿到 WebRequest按 Session.cs 的公开属性C# 侧访问路径为var session Electron.WindowManager.BrowserWindows.First().WebContents.Session; var webRequest session.WebRequest;Session同时还提供了丰富的会话级能力同文件 Session.cs包括Cookies、代理设置SetProxyAsync、网络模拟EnableNetworkEmulation、User-Agent 覆盖SetUserAgent等可与WebRequest配合完成更完整的请求治理。4.2 已实现的 onBeforeRequest 封装仓库的 WebRequest.cs 提供了OnBeforeRequest的完整实现签名如下public void OnBeforeRequest( WebRequestFilter filter, ActionOnBeforeRequestDetails, Actionobject listener)其中两个实体类型定义在同一文件中public class OnBeforeRequestDetails { public int Id { get; set; } public string Url { get; set; } public string Method { get; set; } public int? WebContentsId { get; set; } } public class WebRequestFilter { public string[] Urls { get; set; } }典型的 C# 调用示例拦截并取消对https://ads.example.com/的请求webRequest.OnBeforeRequest( new WebRequestFilter { Urls new[] { *://ads.example.com/* } }, (details, callback) { var shouldCancel details.Url.StartsWith(https://ads.example.com); callback(new { cancel shouldCancel }); });4.3 底层桥接原理C# 与 Electron 主进程如何协作OnBeforeRequest之所以能实现“C# 决定请求去留”依赖 Electron.NET 的 Socket 桥接机制其调用链在 WebRequest.cs 中清晰可见首次注册时C# 通过BridgeConnector.Socket.Emit(register-webContents-session-webRequest-onBeforeRequest, Id, filter)通知 Electron Host 注册拦截Electron Host 端 webContents.ts 调用session.webRequest.onBeforeRequest(filter, ...)在请求到达时把details通过socket.emit(webContents-session-webRequest-onBeforeRequest{id}, details)回传 C#C# 反序列化details为OnBeforeRequestDetails并触发托管事件C# 侧回调时把response通过BridgeConnector.Socket.Emit(webContents-session-webRequest-onBeforeRequest-response{id}, response)发回 Electron HostElectron Host 用electronSocket.once(...)收到该响应后调用原生callback(response)请求据此被放行、取消或重定向。// C# 端核心代码摘自 WebRequest.cs BridgeConnector.Socket.OnJsonElement($webContents-session-webRequest-onBeforeRequest{Id}, (args) { var details args.DeserializeOnBeforeRequestDetails(ElectronJson.Options); var callback (Actionobject)((response) BridgeConnector.Socket.Emit($webContents-session-webRequest-onBeforeRequest-response{Id}, response)); _onBeforeRequest?.Invoke(details, callback); });同时支持RemoveListener取消订阅WebRequest.cs移除监听后若没有剩余订阅者会调用Socket.Off(...)关闭对应事件通道避免资源泄漏。五、实战综合示例请求治理组合拳将各事件组合起来即可构建一个完整的请求治理管道。以下示例演示在 Electron.NET 应用启动后对https://api.example.com/*的请求统一注入 Token、改写响应头并记录日志var webRequest Electron.WindowManager.BrowserWindows.First().WebContents.Session.WebRequest; // 1) 发送前注入认证请求头 webRequest.OnBeforeSendHeaders( new WebRequestFilter { Urls new[] { *://api.example.com/* } }, (details, callback) { var headers new Dictionarystring, string { [Authorization] Bearer token }; callback(new { requestHeaders headers }); }); // 2) 响应头改写同时提供 statusLine webRequest.OnHeadersReceived( new WebRequestFilter { Urls new[] { *://api.example.com/* } }, (details, callback) { callback(new { responseHeaders new Dictionarystring, string { [X-Powered-By] Electron.NET }, statusLine details.StatusLine }); }); // 3) 错误监控 webRequest.OnErrorOccurred( new WebRequestFilter { Urls new[] { *://*/* } }, (details) { Console.WriteLine($请求失败: {details.Url} - {details.Error}); });注意文档明确提示“只有最后一个附着的 listener 会被使用”因此同一事件不要重复注册多个监听器需要取消时传入null或调用RemoveListener。六、常见问题与注意事项主进程限制WebRequest运行于主进程需在 Electron.NET 的主进程上下文OnReady回调等中使用。Listener 唯一性同一事件只保留最后一个listener重复注册会覆盖前一个。URL 过滤粒度URL 模式匹配基于 Chromium 规则*通配符不能匹配路径中的/需写成/*调试时建议先用*://*/*观察全部请求再逐步收窄。改写响应头需带状态行在onHeadersReceived中提供responseHeaders时应同时提供statusLine否则沿用原状态。取消订阅传入null可取消订阅C# 侧也可调用RemoveListener主动解绑避免回调通道残留。七、延伸阅读WebRequest 文档原文本主题的完整 API 参考WebRequest.cs 实现C# 侧OnBeforeRequest封装与桥接事件Session.csWebRequest的宿主类以及 Cookies、代理、User-Agent 等配套会话能力WebContents.cs通过WebContents.Session获取Session实例的入口webContents.tsElectron Host 端将 C# 调用映射到原生session.webRequest的桥接代码WebContents 文档包含Session属性的使用说明与相关注意点。赞分享桌面应用跨平台【免费下载链接】Electron.NET:electron: Build cross platform desktop apps with ASP.NET Core (Razor Pages, MVC, Blazor).项目地址https://gitcode.com/gh_mirrors/el/Electron.NET点击查看免费下载相关推荐Hutool请求拦截HTTP请求响应拦截Hutool请求拦截HTTP请求响应拦截 还在为HTTP请求的全局处理而烦恼每次都要手动添加相同的header、记录日志、处理异常Hutool的HTTP拦后端开发工具Requests请求拦截修改请求头与体内容Requests请求拦截修改请求头与体内容 在网络请求开发中我们经常需要在发送请求前对请求头Header和请求体Body进行修改以满足特定的业务需后端网络通信Requestly HTTP拦截器完全教程拦截、修改和监控网络请求 终极指南掌握Requestly HTTP拦截器的完整使用方法 作为前端开发者和QA工程师最受欢迎的调试工具Requestly能帮助你轻松拦截、修改和文档开发工具接口测试上一篇LifeOS Webdesign 技能输入规范如何撰写高质量 Brief 并准备设计系统输入让 Claude Design 一次出稿即达标下一篇抖音无水印下载神器如何高效批量获取抖音内容素材创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

J-Link RTT调试实战:从硬件握手到日志结构化 2026/9/28 4:33:02

J-Link RTT调试实战:从硬件握手到日志结构化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
ABAP 里没有广播风暴,但会出现更危险的事件风暴、RFC 风暴与消息放大 2026/9/28 4:33:02

ABAP 里没有广播风暴,但会出现更危险的事件风暴、RFC 风暴与消息放大

真正碰到这类问题时,SAP 系统里的现象往往很有迷惑性。 网络工程师口中的广播风暴,常见画面是某个二层网络突然出现海量 Broadcast、Multicast 或 Unknown Unicast 流量,交换机接口被塞满,CPU 升高,正常报文开始丢失,整个广播域里的主机都感觉网络像卡死了一样。 而 AB…

阅读更多 →
国产模型 deepseek 系列用 CC Switch 接入 Claude Code 的配置文件保姆教程 2026/9/28 4:33:02

国产模型 deepseek 系列用 CC Switch 接入 Claude Code 的配置文件保姆教程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
不要新写 Prompt 了,Context Engineering 才是 Coding Agent 的未来:用 TaoToken 统一 Key 打通 Subagent 与 Harness 2026/9/28 4:33:02

不要新写 Prompt 了,Context Engineering 才是 Coding Agent 的未来:用 TaoToken 统一 Key 打通 Subagent 与 Harness

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Langchain实战3-Model和Prompt 2026/9/28 4:33:02

Langchain实战3-Model和Prompt

本节聚焦 LangChain 1.0 的 Model 与 Prompt:模型参数如何影响输出、消息如何组织上下文、Prompt 模板如何复用,以及怎样让模型返回可校验的结构化结果。1. 初始化模型 import os from langchain.chat_models import init_chat_modelmodel init_chat_mo…

阅读更多 →
Spring AI Alibaba 概览:用 TaoToken 统一 Key 打通多智能体工作流配置 2026/9/28 4:32:55

Spring AI Alibaba 概览:用 TaoToken 统一 Key 打通多智能体工作流配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉