.NET 开发者的“Fiddler”:Titanium.Web.Proxy 库的强大魅力

发布于:2025-09-05 ⋅ 阅读:(16) ⋅ 点赞:(0)

在日常开发中,我们经常需要监控和分析网络请求。虽然 Fiddler 和 Charles 等工具功能强大,但有时我们需要将抓包功能集成到自己的应用中。Titanium.Web.Proxy 就是一个强大的 .NET 库,它允许我们在自己的应用中实现完整的 HTTP/HTTPS 抓包功能。

本文将基于一个实际的 Windows Forms .net 8.0项目,展示如何使用 Titanium.Web.Proxy 构建一个功能完善的网络监控工具。

一、安装NuGet 包

Install-Package Titanium.Web.Proxy

二、代理服务器初始化

private void InitializeProxy()
{
    proxyServer = new ProxyServer();
    proxyServer.CertificateManager.CreateRootCertificate();
    proxyServer.CertificateManager.TrustRootCertificateAsAdmin();
}

证书管理是 HTTPS 抓包的关键,Titanium.Web.Proxy 会自动处理证书的创建和信任,使我们可以解密 HTTPS 流量。证书安装一次后不会重复提示安装。(之前在用FiddlerCore的时候,每次启动应用都需要安装一次证书,所以找替代库,就找到了Titanium.Web.Proxy)

三、启动代理服务器

private async Task StartCapture()
{
    try
    {
        // 验证端口号
        if (!int.TryParse(txtPort.Text, out int port) || port < 1 || port > 65535)
        {
            MessageBox.Show("请输入有效的端口号 (1-65535)");
            return;
        }

        // 创建代理端点
        var explicitEndPoint = new ExplicitProxyEndPoint(IPAddress.Any, port, true);
        
        if (proxyServer != null)
        {
            // 注册请求处理事件
            proxyServer.BeforeRequest += OnRequest;
            proxyServer.BeforeResponse += OnResponse;
            
            // 启动代理
            proxyServer.AddEndPoint(explicitEndPoint);
            proxyServer.Start();
            
            // 设置系统代理
            proxyServer.SetAsSystemHttpProxy(explicitEndPoint);
            proxyServer.SetAsSystemHttpsProxy(explicitEndPoint);

            isCapturing = true;
            LogManager.Log($"代理已启动,监听端口: {port}\r\n");
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show($"启动代理失败: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

四、逻辑处理

OnRequest这是抓包的核心功能,所有经过代理的请求都会触发这个事件。

private async Task OnRequest(object sender, SessionEventArgs e)
{
    //这里我们经常需要过滤特定类型的请求
    //
    DataManager.HandleData(e.HttpClient.Request.Url);
}

private async Task OnRequest(object sender, SessionEventArgs e)
{
    // 这里可以修改请求和响应
    // 修改请求头
    e.HttpClient.Request.Headers.Add("X-Custom-Header", "Value");
    
    // 修改请求体
    if (e.HttpClient.Request.Method == "POST")
    {
        var body = await e.GetRequestBody();
        var modifiedBody = body.Replace("old", "new");
        await e.SetRequestBody(modifiedBody);
    }
}


网站公告

今日签到

点亮在社区的每一天
去签到