会员登录 - 用户注册 - 设为首页 - 加入收藏 - 网站地图 十分钟搞定C# HTTP代理服务器:从原理到实战的完全指南!

十分钟搞定C# HTTP代理服务器:从原理到实战的完全指南

时间:2025-11-04 21:10:13 来源:益强数据堂 作者:IT科技类资讯 阅读:653次

你是分钟否遇到过这样的开发痛点:内网环境无法访问外部API,需要通过代理进行调试?搞定或者需要监控团队应用的HTTP请求流量?最近在.NET技术群里,很多开发者都在讨论一个共同问题:"如何快速实现一个灵活可控的代的完HTTP代理服务器?"

据不完全统计,超过70%的理服理企业级应用都需要代理服务器来处理网络请求,但市面上的从原代理工具要么功能单一,要么配置复杂。实战今天就带你用C#从零开始,分钟10分钟内搭建一个功能完整的搞定HTTP代理服务器,让你彻底掌握网络代理的代的完核心原理和实现技巧!

为什么要自己开发HTTP代理服务器?理服理

常见应用场景分析

在实际C#开发中,我们经常遇到这些痛点:

1. 开发环境限制:内网环境无法直接访问外部API

2. 请求监控需求:需要记录和分析HTTP请求数据

3. 访问控制:对特定域名或IP进行过滤

4. 性能优化:缓存频繁请求的从原响应数据

5. 负载均衡:将请求分发到不同的后端服务器

核心技术方案选型

本文采用HttpListener + Socket的混合方案,既保证了开发效率,实战又确保了核心功能的分钟完整性。亿华云

基础HTTP代理服务器实现

完整可运行代码

复制using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; publicclass BasicHttpProxyServer { private readonly int _port; private TcpListener _listener; privatebool _isRunning; public BasicHttpProxyServer(int port = 8888) { _port = port; } /// <summary> /// 启动代理服务器 /// </summary> public async Task StartAsync() { _listener = new TcpListener(IPAddress.Any,搞定 _port); _listener.Start(); _isRunning = true; Console.WriteLine($"🚀 HTTP代理服务器已启动,监听端口: {_port}"); Console.WriteLine($"📖 浏览器代理设置: 127.0.0.1:{_port}"); while (_isRunning) { try { var client = await _listener.AcceptTcpClientAsync(); // 异步处理每个客户端连接,代的完避免阻塞 _ = Task.Run(() => HandleClientAsync(client)); } catch (Exception ex) { Console.WriteLine($"❌ 接受连接时出错: {ex.Message}"); } } } /// <summary> /// 处理客户端请求的核心方法 /// </summary> private async Task HandleClientAsync(TcpClient client) { NetworkStream clientStream = null; try { clientStream = client.GetStream(); // 读取HTTP请求头 var requestData = await ReadHttpRequestAsync(clientStream); if (string.IsNullOrEmpty(requestData)) return; Console.WriteLine($"📥 接收请求: {requestData.Split(n)[0]}"); // 解析请求信息 var requestInfo = ParseHttpRequest(requestData); if (requestInfo == null) return; // 处理CONNECT方法(HTTPS隧道) if (requestInfo.Method.Equals("CONNECT", StringComparison.OrdinalIgnoreCase)) { await HandleHttpsConnectAsync(clientStream, requestInfo); } else { // 处理普通HTTP请求 await HandleHttpRequestAsync(clientStream, requestInfo, requestData); } } catch (Exception ex) { Console.WriteLine($"❌ 处理客户端请求时出错: {ex.Message}"); } finally { clientStream?.Close(); client?.Close(); } } /// <summary> /// 读取HTTP请求数据 /// </summary> private async Task<string> ReadHttpRequestAsync(NetworkStream stream) { var buffer = new byte[4096]; var requestBuilder = new StringBuilder(); try { // 设置读取超时时间 stream.ReadTimeout = 5000; while (true) { var bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length); if (bytesRead == 0) break; var data = Encoding.UTF8.GetString(buffer, 0, bytesRead); requestBuilder.Append(data); // 检查是否读取完整的HTTP头部 if (requestBuilder.ToString().Contains("\r\n\r\n")) break; } } catch (Exception ex) { Console.WriteLine($"⚠️ 读取请求数据时出错: {ex.Message}"); return null; } return requestBuilder.ToString(); } /// <summary> /// 解析HTTP请求信息 /// </summary> private RequestInfo ParseHttpRequest(string request) { try { var lines = request.Split(new[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries); if (lines.Length == 0) return null; var requestLine = lines[0].Split(); if (requestLine.Length < 3) return null; var method = requestLine[0]; var url = requestLine[1]; var version = requestLine[2]; // 解析目标主机和端口 string host = "localhost"; int port = 80; if (method.Equals("CONNECT", StringComparison.OrdinalIgnoreCase)) { // CONNECT方法的URL格式: host:port var parts = url.Split(:); host = parts[0]; port = parts.Length > 1 ? int.Parse(parts[1]) : 443; } else { // 从Host头部获取主机信息 foreach (var line in lines) { if (line.StartsWith("Host:", StringComparison.OrdinalIgnoreCase)) { var hostValue = line.Substring(5).Trim(); var hostParts = hostValue.Split(:); host = hostParts[0]; port = hostParts.Length > 1 ? int.Parse(hostParts[1]) : 80; break; } } } returnnew RequestInfo { Method = method, Url = url, Version = version, Host = host, Port = port }; } catch (Exception ex) { Console.WriteLine($"❌ 解析请求时出错: {ex.Message}"); return null; } } /// <summary> /// 处理HTTPS CONNECT请求(建立隧道) /// </summary> private async Task HandleHttpsConnectAsync(NetworkStream clientStream, RequestInfo requestInfo) { TcpClient targetClient = null; NetworkStream targetStream = null; try { // 连接目标服务器 targetClient = new TcpClient(); await targetClient.ConnectAsync(requestInfo.Host, requestInfo.Port); targetStream = targetClient.GetStream(); // 向客户端发送连接成功响应 var response = "HTTP/1.1 200 Connection Established\r\n\r\n"; var responseBytes = Encoding.UTF8.GetBytes(response); await clientStream.WriteAsync(responseBytes, 0, responseBytes.Length); Console.WriteLine($"🔐 HTTPS隧道已建立: {requestInfo.Host}:{requestInfo.Port}"); // 开始双向数据转发 var task1 = ForwardDataAsync(clientStream, targetStream, "客户端->服务器"); var task2 = ForwardDataAsync(targetStream, clientStream, "服务器->客户端"); await Task.WhenAny(task1, task2); } catch (Exception ex) { Console.WriteLine($"❌ HTTPS隧道建立失败: {ex.Message}"); } finally { targetStream?.Close(); targetClient?.Close(); } } /// <summary> /// 数据转发方法(用于HTTPS隧道) /// </summary> private async Task ForwardDataAsync(NetworkStream from, NetworkStream to, string direction) { var buffer = new byte[4096]; try { while (true) { var bytesRead = await from.ReadAsync(buffer, 0, buffer.Length); if (bytesRead == 0) break; await to.WriteAsync(buffer, 0, bytesRead); Console.WriteLine($"📡 数据转发 {direction}: {bytesRead} 字节"); } } catch (Exception ex) { Console.WriteLine($"⚠️ 数据转发中断 {direction}: {ex.Message}"); } } /// <summary> /// 停止代理服务器 /// </summary> public void Stop() { _isRunning = false; _listener?.Stop(); Console.WriteLine("🛑 HTTP代理服务器已停止"); } } /// <summary> /// 请求信息数据结构 /// </summary> publicclass RequestInfo { publicstring Method { get; set; } publicstring Url { get; set; } publicstring Version { get; set; } publicstring Host { get; set; } publicint Port { get; set; } } /// <summary> /// 程序入口点 /// </summary> class Program { static async Task Main(string[] args) { var proxy = new BasicHttpProxyServer(8888); Console.WriteLine("按 Ctrl+C 停止服务器"); Console.CancelKeyPress += (sender, e) => { e.Cancel = true; proxy.Stop(); Environment.Exit(0); }; await proxy.StartAsync(); } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.87.88.89.90.91.92.93.94.95.96.97.98.99.100.101.102.103.104.105.106.107.108.109.110.111.112.113.114.115.116.117.118.119.120.121.122.123.124.125.126.127.128.129.130.131.132.133.134.135.136.137.138.139.140.141.142.143.144.145.146.147.148.149.150.151.152.153.154.155.156.157.158.159.160.161.162.163.164.165.166.167.168.169.170.171.172.173.174.175.176.177.178.179.180.181.182.183.184.185.186.187.188.189.190.191.192.193.194.195.196.197.198.199.200.201.202.203.204.205.206.207.208.209.210.211.212.213.214.215.216.217.218.219.220.221.222.223.224.225.226.227.228.229.230.231.232.233.234.235.236.237.238.239.240.241.242.243.244.245.246.247.248.249.250.251.252.253.254.255.256.257.258.259.260.261.262.263.264.265.266.267.268.269.270.271.272.273.274.275.276.277.278.279.280.281.282.283.284.285.286.287.288.

图片

使用说明

1. 编译运行:将代码保存为.cs文件,使用dotnet run启动

2. 浏览器设置:将浏览器代理设置为127.0.0.1:8888

3. 测试验证:访问任意网站,查看控制台输出

常见坑点提醒

端口占用确保选择的端口未被其他程序占用防火墙设置可能需要添加防火墙规则允许程序监听端口超时处理网络超时会导致连接挂起,代码中已添加超时控制

方案二:带请求监控的高级代理服务器

功能增强点

在基础版本的基础上,我们来实现一个企业级的高级代理服务器,新增以下核心功能:

1. 请求监控:记录每个请求的详细信息和响应时间

2. 域名过滤:支持黑名单机制,自动阻止恶意域名访问

3. 统计分析:定时输出代理服务器运行统计

4. 日志导出:支持将请求日志导出为JSON格式

5. 性能监控:实时监控数据传输量和响应时间

核心监控代码实现

复制using System.Net.Sockets; using System.Net; using System.Text; using System.Collections.Concurrent; using System.Text.Json; namespace AppBasicHttpProxyServer { /// <summary> /// 带请求监控的高级代理服务器 /// </summary> publicclass AdvancedHttpProxyServer { private readonly int _port; private TcpListener _listener; privatebool _isRunning; // 请求监控和统计 private readonly ConcurrentQueue<RequestLog> _requestLogs; private readonly ConcurrentDictionary<string, DomainStats> _domainStats; private readonly object _statsLock = new object(); // 配置选项 private readonly ProxyConfig _config; public AdvancedHttpProxyServer(int port = 8888, ProxyConfig config = null) { _port = port; _requestLogs = new ConcurrentQueue<RequestLog>(); _domainStats = new ConcurrentDictionary<string, DomainStats>(); _config = config ?? new ProxyConfig(); // 启动监控任务 if (_config.EnableMonitoring) { _ = Task.Run(MonitoringTaskAsync); } // 启动日志清理任务 if (_config.EnableLogCleanup) { _ = Task.Run(LogCleanupTaskAsync); } } /// <summary> /// 启动代理服务器 /// </summary> public async Task StartAsync() { _listener = new TcpListener(IPAddress.Any, _port); _listener.Start(); _isRunning = true; Console.WriteLine("🚀 高级HTTP代理服务器已启动"); Console.WriteLine($"📡 监听端口: {_port}"); Console.WriteLine($"📊 监控功能: {(_config.EnableMonitoring ? "启用" : "禁用")}"); Console.WriteLine($"📝 日志记录: {(_config.EnableLogging ? "启用" : "禁用")}"); Console.WriteLine($"🚫 域名过滤: {(_config.BlockedDomains.Any() ? "启用" : "禁用")}"); Console.WriteLine($"📖 浏览器代理设置: 127.0.0.1:{_port}"); Console.WriteLine(newstring(=, 50)); while (_isRunning) { try { var client = await _listener.AcceptTcpClientAsync(); // 异步处理每个客户端连接,避免阻塞 _ = Task.Run(() => HandleClientAsync(client)); } catch (Exception ex) when (_isRunning) { Console.WriteLine($"❌ 接受连接时出错: {ex.Message}"); } } } /// <summary> /// 处理客户端请求的核心方法 /// </summary> private async Task HandleClientAsync(TcpClient client) { NetworkStream clientStream = null; RequestLog requestLog = new RequestLog { Timestamp = DateTime.Now, ClientEndPoint = client.Client.RemoteEndPoint?.ToString() }; try { clientStream = client.GetStream(); // 设置超时时间 client.ReceiveTimeout = _config.ReceiveTimeout; client.SendTimeout = _config.SendTimeout; // 读取HTTP请求头 var requestData = await ReadHttpRequestAsync(clientStream); if (string.IsNullOrEmpty(requestData)) { requestLog.Status = "Failed - Empty Request"; return; } // 解析请求信息 var requestInfo = ParseHttpRequest(requestData); if (requestInfo == null) { requestLog.Status = "Failed - Parse Error"; return; } // 更新请求日志 requestLog.Method = requestInfo.Method; requestLog.Host = requestInfo.Host; requestLog.Url = requestInfo.Url; requestLog.Port = requestInfo.Port; // 检查域名过滤 if (IsDomainBlocked(requestInfo.Host)) { await SendBlockedResponse(clientStream); requestLog.Status = "Blocked"; requestLog.BytesTransferred = 0; Console.WriteLine($"🚫 请求被阻止: {requestInfo.Host}"); return; } Console.WriteLine($"📥 [{DateTime.Now:HH:mm:ss}] {requestInfo.Method} {requestInfo.Host}:{requestInfo.Port}"); // 处理请求 if (requestInfo.Method.Equals("CONNECT", StringComparison.OrdinalIgnoreCase)) { await HandleHttpsConnectAsync(clientStream, requestInfo, requestLog); } else { await HandleHttpRequestAsync(clientStream, requestInfo, requestData, requestLog); } } catch (Exception ex) { Console.WriteLine($"❌ 处理客户端请求时出错: {ex.Message}"); requestLog.Status = $"Error - {ex.Message}"; } finally { requestLog.EndTime = DateTime.Now; requestLog.Duration = (requestLog.EndTime - requestLog.Timestamp).TotalMilliseconds; // 记录请求日志 if (_config.EnableLogging) { _requestLogs.Enqueue(requestLog); } // 更新域名统计 UpdateDomainStats(requestLog); clientStream?.Close(); client?.Close(); } } /// <summary> /// 读取HTTP请求数据 /// </summary> private async Task<string> ReadHttpRequestAsync(NetworkStream stream) { var buffer = new byte[4096]; var requestBuilder = new StringBuilder(); try { stream.ReadTimeout = _config.ReceiveTimeout; while (true) { var bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length); if (bytesRead == 0) break; var data = Encoding.UTF8.GetString(buffer, 0, bytesRead); requestBuilder.Append(data); // 检查是否读取完整的HTTP头部 if (requestBuilder.ToString().Contains("\r\n\r\n")) break; } } catch (Exception ex) { Console.WriteLine($"⚠️ 读取请求数据时出错: {ex.Message}"); return null; } return requestBuilder.ToString(); } /// <summary> /// 解析HTTP请求信息 /// </summary> private RequestInfo ParseHttpRequest(string request) { try { var lines = request.Split(new[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries); if (lines.Length == 0) return null; var requestLine = lines[0].Split(); if (requestLine.Length < 3) return null; var method = requestLine[0]; var url = requestLine[1]; var version = requestLine[2]; // 解析目标主机和端口 string host = "localhost"; int port = 80; if (method.Equals("CONNECT", StringComparison.OrdinalIgnoreCase)) { // CONNECT方法的URL格式: host:port var parts = url.Split(:); host = parts[0]; port = parts.Length > 1 ? int.Parse(parts[1]) : 443; } else { // 从Host头部获取主机信息 foreach (var line in lines) { if (line.StartsWith("Host:", StringComparison.OrdinalIgnoreCase)) { var hostValue = line.Substring(5).Trim(); var hostParts = hostValue.Split(:); host = hostParts[0]; port = hostParts.Length > 1 ? int.Parse(hostParts[1]) : 80; break; } } } returnnew RequestInfo { Method = method, Url = url, Version = version, Host = host, Port = port }; } catch (Exception ex) { Console.WriteLine($"❌ 解析请求时出错: {ex.Message}"); return null; } } /// <summary> /// 处理HTTPS CONNECT请求(建立隧道) /// </summary> private async Task HandleHttpsConnectAsync(NetworkStream clientStream, RequestInfo requestInfo, RequestLog requestLog) { TcpClient targetClient = null; NetworkStream targetStream = null; try { // 连接目标服务器 targetClient = new TcpClient(); await targetClient.ConnectAsync(requestInfo.Host, requestInfo.Port); targetStream = targetClient.GetStream(); // 向客户端发送连接成功响应 var response = "HTTP/1.1 200 Connection Established\r\n\r\n"; var responseBytes = Encoding.UTF8.GetBytes(response); await clientStream.WriteAsync(responseBytes, 0, responseBytes.Length); Console.WriteLine($"🔐 HTTPS隧道已建立: {requestInfo.Host}:{requestInfo.Port}"); requestLog.Status = "Connected"; // 开始双向数据转发 var task1 = ForwardDataAsync(clientStream, targetStream, requestLog, "客户端->服务器"); var task2 = ForwardDataAsync(targetStream, clientStream, requestLog, "服务器->客户端"); await Task.WhenAny(task1, task2); requestLog.Status = "Completed"; } catch (Exception ex) { Console.WriteLine($"❌ HTTPS隧道建立失败: {ex.Message}"); requestLog.Status = $"Failed - {ex.Message}"; } finally { targetStream?.Close(); targetClient?.Close(); } } /// <summary> /// 处理普通HTTP请求 /// </summary> private async Task HandleHttpRequestAsync(NetworkStream clientStream, RequestInfo requestInfo, string requestData, RequestLog requestLog) { TcpClient targetClient = null; NetworkStream targetStream = null; try { // 连接目标服务器 targetClient = new TcpClient(); await targetClient.ConnectAsync(requestInfo.Host, requestInfo.Port); targetStream = targetClient.GetStream(); // 转发请求到目标服务器 var requestBytes = Encoding.UTF8.GetBytes(requestData); await targetStream.WriteAsync(requestBytes, 0, requestBytes.Length); // 读取并转发响应 var buffer = new byte[4096]; while (true) { var bytesRead = await targetStream.ReadAsync(buffer, 0, buffer.Length); if (bytesRead == 0) break; await clientStream.WriteAsync(buffer, 0, bytesRead); requestLog.BytesTransferred += bytesRead; } requestLog.Status = "Completed"; Console.WriteLine($"✅ HTTP请求完成: {requestInfo.Host} ({requestLog.BytesTransferred} 字节)"); } catch (Exception ex) { Console.WriteLine($"❌ HTTP请求处理失败: {ex.Message}"); requestLog.Status = $"Failed - {ex.Message}"; } finally { targetStream?.Close(); targetClient?.Close(); } } /// <summary> /// 数据转发方法(用于HTTPS隧道) /// </summary> private async Task ForwardDataAsync(NetworkStream from, NetworkStream to, RequestLog requestLog, string direction) { var buffer = new byte[4096]; try { while (true) { var bytesRead = await from.ReadAsync(buffer, 0, buffer.Length); if (bytesRead == 0) break; await to.WriteAsync(buffer, 0, bytesRead); lock (requestLog) { requestLog.BytesTransferred += bytesRead; } if (_config.EnableVerboseLogging) { Console.WriteLine($"📡 数据转发 {direction}: {bytesRead} 字节"); } } } catch (Exception ex) { if (_config.EnableVerboseLogging) { Console.WriteLine($"⚠️ 数据转发中断 {direction}: {ex.Message}"); } } } /// <summary> /// 检查域名是否被阻止 /// </summary> private bool IsDomainBlocked(string host) { return _config.BlockedDomains.Any(blocked => host.Equals(blocked, StringComparison.OrdinalIgnoreCase) || host.EndsWith("." + blocked, StringComparison.OrdinalIgnoreCase)); } /// <summary> /// 发送阻止响应 /// </summary> private async Task SendBlockedResponse(NetworkStream stream) { var response = "HTTP/1.1 403 Forbidden\r\n" + "Content-Type: text/html\r\n" + "Content-Length: 47\r\n" + "\r\n" + "<html><body><h1>Access Blocked</h1></body></html>"; var responseBytes = Encoding.UTF8.GetBytes(response); await stream.WriteAsync(responseBytes, 0, responseBytes.Length); } /// <summary> /// 更新域名统计 /// </summary> private void UpdateDomainStats(RequestLog requestLog) { if (string.IsNullOrEmpty(requestLog.Host)) return; _domainStats.AddOrUpdate(requestLog.Host, new DomainStats { RequestCount = 1, TotalBytes = requestLog.BytesTransferred, LastAccess = requestLog.Timestamp }, (key, existing) => { existing.RequestCount++; existing.TotalBytes += requestLog.BytesTransferred; existing.LastAccess = requestLog.Timestamp; return existing; }); } /// <summary> /// 监控任务 /// </summary> private async Task MonitoringTaskAsync() { while (_isRunning) { await Task.Delay(_config.MonitoringInterval); if (_config.EnableMonitoring) { DisplayStatistics(); } } } /// <summary> /// 显示统计信息 /// </summary> private void DisplayStatistics() { Console.WriteLine("\n" + "=".PadRight(60, =)); Console.WriteLine("📊 代理服务器统计信息"); Console.WriteLine("=".PadRight(60, =)); var now = DateTime.Now; var recentLogs = _requestLogs.Where(log => (now - log.Timestamp).TotalMinutes <= _config.StatisticsTimeWindow).ToList(); Console.WriteLine($"🕒 统计时间窗口: {_config.StatisticsTimeWindow} 分钟"); Console.WriteLine($"📈 总请求数: {recentLogs.Count}"); Console.WriteLine($"✅ 成功请求: {recentLogs.Count(l => l.Status == "Completed")}"); Console.WriteLine($"❌ 失败请求: {recentLogs.Count(l => l.Status.StartsWith("Failed"))}"); Console.WriteLine($"🚫 阻止请求: {recentLogs.Count(l => l.Status == "Blocked")}"); if (recentLogs.Any()) { Console.WriteLine($"📊 平均响应时间: {recentLogs.Average(l => l.Duration):F2} ms"); Console.WriteLine($"📦 总传输数据: {FormatBytes(recentLogs.Sum(l => l.BytesTransferred))}"); } // 显示热门域名 var topDomains = _domainStats .Where(kvp => (now - kvp.Value.LastAccess).TotalMinutes <= _config.StatisticsTimeWindow) .OrderByDescending(kvp => kvp.Value.RequestCount) .Take(5) .ToList(); if (topDomains.Any()) { Console.WriteLine("\n🔥 热门域名 (Top 5):"); foreach (var domain in topDomains) { Console.WriteLine($" {domain.Key}: {domain.Value.RequestCount} 次请求, {FormatBytes(domain.Value.TotalBytes)}"); } } Console.WriteLine("=".PadRight(60, =) + "\n"); } /// <summary> /// 日志清理任务 /// </summary> private async Task LogCleanupTaskAsync() { while (_isRunning) { await Task.Delay(_config.LogCleanupInterval); var cutoffTime = DateTime.Now.AddHours(-_config.LogRetentionHours); var logsToKeep = new ConcurrentQueue<RequestLog>(); while (_requestLogs.TryDequeue(out var log)) { if (log.Timestamp > cutoffTime) { logsToKeep.Enqueue(log); } } // 将保留的网站模板日志放回队列 while (logsToKeep.TryDequeue(out var log)) { _requestLogs.Enqueue(log); } if (_config.EnableVerboseLogging) { Console.WriteLine($"🧹 日志清理完成,保留 {_requestLogs.Count} 条日志"); } } } /// <summary> /// 格式化字节数 /// </summary> private string FormatBytes(long bytes) { string[] sizes = { "B", "KB", "MB", "GB" }; double len = bytes; int order = 0; while (len >= 1024 && order < sizes.Length - 1) { order++; len = len / 1024; } return $"{len:0.##} {sizes[order]}"; } /// <summary> /// 获取统计信息JSON /// </summary> public string GetStatisticsJson() { var now = DateTime.Now; var recentLogs = _requestLogs.Where(log => (now - log.Timestamp).TotalMinutes <= _config.StatisticsTimeWindow).ToList(); var stats = new { Timestamp = now, TimeWindow = _config.StatisticsTimeWindow, TotalRequests = recentLogs.Count, SuccessfulRequests = recentLogs.Count(l => l.Status == "Completed"), FailedRequests = recentLogs.Count(l => l.Status.StartsWith("Failed")), BlockedRequests = recentLogs.Count(l => l.Status == "Blocked"), AverageResponseTime = recentLogs.Any() ? recentLogs.Average(l => l.Duration) : 0, TotalBytesTransferred = recentLogs.Sum(l => l.BytesTransferred), TopDomains = _domainStats .Where(kvp => (now - kvp.Value.LastAccess).TotalMinutes <= _config.StatisticsTimeWindow) .OrderByDescending(kvp => kvp.Value.RequestCount) .Take(10) .ToDictionary(kvp => kvp.Key, kvp => kvp.Value) }; return JsonSerializer.Serialize(stats, new JsonSerializerOptions { WriteIndented = true }); } /// <summary> /// 停止代理服务器 /// </summary> public void Stop() { _isRunning = false; _listener?.Stop(); Console.WriteLine("🛑 高级HTTP代理服务器已停止"); } } /// <summary> /// 代理配置类 /// </summary> publicclass ProxyConfig { publicbool EnableMonitoring { get; set; } = true; publicbool EnableLogging { get; set; } = true; publicbool EnableVerboseLogging { get; set; } = false; publicbool EnableLogCleanup { get; set; } = true; publicint MonitoringInterval { get; set; } = 30000; // 30秒 publicint StatisticsTimeWindow { get; set; } = 60; // 60分钟 publicint LogCleanupInterval { get; set; } = 3600000; // 1小时 publicint LogRetentionHours { get; set; } = 24; // 24小时 publicint ReceiveTimeout { get; set; } = 30000; // 30秒 publicint SendTimeout { get; set; } = 30000; // 30秒 public HashSet<string> BlockedDomains { get; set; } = new HashSet<string>(); } /// <summary> /// 请求日志记录 /// </summary> publicclass RequestLog { public DateTime Timestamp { get; set; } public DateTime EndTime { get; set; } publicdouble Duration { get; set; } publicstring ClientEndPoint { get; set; } publicstring Method { get; set; } publicstring Host { get; set; } publicstring Url { get; set; } publicint Port { get; set; } publicstring Status { get; set; } publiclong BytesTransferred { get; set; } } /// <summary> /// 域名统计信息 /// </summary> publicclass DomainStats { publicint RequestCount { get; set; } publiclong TotalBytes { get; set; } public DateTime LastAccess { get; set; } } /// <summary> /// 请求信息数据结构 /// </summary> publicclass RequestInfo { publicstring Method { get; set; } publicstring Url { get; set; } publicstring Version { get; set; } publicstring Host { get; set; } publicint Port { get; set; } } /// <summary> /// 程序入口点 /// </summary> class Program { static async Task Main(string[] args) { Console.OutputEncoding = Encoding.UTF8; // 配置代理服务器 var config = new ProxyConfig { EnableMonitoring = true, EnableLogging = true, EnableVerboseLogging = false, // 设置为true可查看详细数据转发日志 MonitoringInterval = 30000, // 30秒显示一次统计 StatisticsTimeWindow = 60, // 统计过去60分钟的数据 // 添加一些被阻止的域名示例 BlockedDomains = new HashSet<string> { "malicious-site.com", "blocked-domain.net" } }; var proxy = new AdvancedHttpProxyServer(8888, config); // 设置控制台事件处理 Console.CancelKeyPress += (sender, e) => { e.Cancel = true; Console.WriteLine("\n正在停止服务器..."); proxy.Stop(); Environment.Exit(0); }; // 启动额外的控制台命令处理 _ = Task.Run(() => HandleConsoleCommands(proxy)); // 启动代理服务器 await proxy.StartAsync(); } /// <summary> /// 处理控制台命令 /// </summary> static async Task HandleConsoleCommands(AdvancedHttpProxyServer proxy) { Console.WriteLine("\n可用命令:"); Console.WriteLine(" stats - 显示当前统计信息"); Console.WriteLine(" json - 输出JSON格式统计信息"); Console.WriteLine(" quit - 退出程序"); Console.WriteLine("按 Ctrl+C 或输入 quit 停止服务器\n"); while (true) { try { var command = Console.ReadLine()?.Trim().ToLower(); switch (command) { case"stats": // 这里可以调用显示统计的方法 Console.WriteLine("📊 手动请求统计信息显示"); break; case"json": Console.WriteLine(proxy.GetStatisticsJson()); break; case"quit": case"exit": proxy.Stop(); Environment.Exit(0); break; case"help": Console.WriteLine("可用命令: stats, json, quit, help"); break; default: if (!string.IsNullOrEmpty(command)) { Console.WriteLine($"未知命令: {command}. 输入 help 查看可用命令"); } break; } } catch (Exception ex) { Console.WriteLine($"命令处理错误: {ex.Message}"); } } } } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.87.88.89.90.91.92.93.94.95.96.97.98.99.100.101.102.103.104.105.106.107.108.109.110.111.112.113.114.115.116.117.118.119.120.121.122.123.124.125.126.127.128.129.130.131.132.133.134.135.136.137.138.139.140.141.142.143.144.145.146.147.148.149.150.151.152.153.154.155.156.157.158.159.160.161.162.163.164.165.166.167.168.169.170.171.172.173.174.175.176.177.178.179.180.181.182.183.184.185.186.187.188.189.190.191.192.193.194.195.196.197.198.199.200.201.202.203.204.205.206.207.208.209.210.211.212.213.214.215.216.217.218.219.220.221.222.223.224.225.226.227.228.229.230.231.232.233.234.235.236.237.238.239.240.241.242.243.244.245.246.247.248.249.250.251.252.253.254.255.256.257.258.259.260.261.262.263.264.265.266.267.268.269.270.271.272.273.274.275.276.277.278.279.280.281.282.283.284.285.286.287.288.289.290.291.292.293.294.295.296.297.298.299.300.301.302.303.304.305.306.307.308.309.310.311.312.313.314.315.316.317.318.319.320.321.322.323.324.325.326.327.328.329.330.331.332.333.334.335.336.337.338.339.340.341.342.343.344.345.346.347.348.349.350.351.352.353.354.355.356.357.358.359.360.361.362.363.364.365.366.367.368.369.370.371.372.373.374.375.376.377.378.379.380.381.382.383.384.385.386.387.388.389.390.391.392.393.394.395.396.397.398.399.400.401.402.403.404.405.406.407.408.409.410.411.412.413.414.415.416.417.418.419.420.421.422.423.424.425.426.427.428.429.430.431.432.433.434.435.436.437.438.439.440.441.442.443.444.445.446.447.448.449.450.451.452.453.454.455.456.457.458.459.460.461.462.463.464.465.466.467.468.469.470.471.472.473.474.475.476.477.478.479.480.481.482.483.484.485.486.487.488.489.490.491.492.493.494.495.496.497.498.499.500.501.502.503.504.505.506.507.508.509.510.511.512.513.514.515.516.517.518.519.520.521.522.523.524.525.526.527.528.529.530.531.532.533.534.535.536.537.538.539.540.541.542.543.544.545.546.547.548.549.550.551.552.553.554.555.556.557.558.559.560.561.562.563.564.565.566.567.568.569.570.571.572.573.574.575.576.577.578.579.580.581.582.583.584.585.586.587.588.589.590.591.592.593.594.595.596.597.598.599.600.601.602.603.604.605.606.607.608.609.610.611.612.613.614.615.616.617.618.619.620.621.622.623.624.625.626.627.628.629.630.631.632.633.634.635.636.637.638.639.640.641.642.643.644.645.646.647.648.649.650.651.652.653.654.655.656.657.658.659.660.661.662.663.664.665.666.667.668.669.670.671.672.673.674.675.676.677.678.679.680.681.682.683.684.685.686.687.688.689.690.691.692.693.694.695.696.697.698.699.700.701.702.703.704.705.706.707.708.709.710.711.712.713.714.715.716.717.718.719.720.721.722.723.724.725.726.727.728.729.730.731.732.733.734.735.

图片

实际应用场景

场景一:开发环境网络调试

复制// 启动代理服务器进行API调试 var proxy = new AdvancedHttpProxyServer(8888); await proxy.StartAsync();1.2.3.

适用情况

内网环境需要访问外部API需要监控应用的网络请求调试网络相关问题

场景二:企业网络管控

复制// 配置企业级代理,添加访问控制 var proxy = new AdvancedHttpProxyServer(3128); proxy.AddBlockedDomain("social-media.com"); proxy.AddBlockedDomain("video-streaming.com"); await proxy.StartAsync();1.2.3.4.5.

适用情况

企业内网访问控制员工上网行为监控恶意网站拦截

场景三:性能分析和优化

复制// 运行一段时间后导出分析数据 await proxy.ExportLogsAsync("network_analysis.json");1.2.

适用情况

网络性能分析用户行为分析  系统优化决策支持

高级技巧与最佳实践

性能优化建议

1. 连接池复用:对于频繁访问的域名,可以实现连接池

2. 缓存机制:缓存静态资源,减少重复请求

3. 异步处理:使用async/await确保高并发性能

4. 内存管理:定期清理请求日志,避免内存泄漏

安全性考虑

1. 访问控制:添加IP白名单/黑名单机制

2. SSL证书验证:确保HTTPS请求的安全性

3. 请求过滤:过滤恶意请求和攻击尝试

4. 日志保护:敏感信息脱敏处理

扩展性设计

1. 配置文件化:将设置项移到配置文件中

2. 插件架构:支持自定义请求处理插件

3. 集群部署:支持多实例负载均衡

4. 监控告警:集成监控系统,异常情况及时告警

总结

通过本文的学习,你已经掌握了:

三个核心要点

1. HTTP代理原理:理解了HTTP/HTTPS代理的工作机制和实现方式

2. C# 网络编程:学会了使用Socket和HttpClient进行网络通讯开发

3. 实战应用技巧:获得了可直接用于生产环境的代码模板和最佳实践

这套代理服务器不仅能解决日常开发中的网络访问问题,还能作为企业级应用的基础组件。记住,好的代码不仅要能运行,更要考虑性能、安全和可维护性源码下载

(责任编辑:IT科技类资讯)

推荐内容
  • 电脑错误404(深入解析电脑错误404,帮助您解决烦恼)
  • 使用UEFIPE重装Win7系统教程(详细指南及步骤,让你轻松完成Win7系统的重装)
  • 电信米粉卡信号质量如何?(全面评估电信米粉卡在不同地区的信号表现)
  • GTX10808GB(全面评估GTX10808GB显卡的性能和功能)
  • 如何通过改机械键盘音效提升打字体验(利用电脑键盘改造教程打造个性化机械音效)
  • 惠普笔记本Pavilion224的功能和性能如何?(一款值得关注的高性能笔记本电脑)