如何记录两台IIS服务器间.Net应用的JSON调用内容
捕获IIS上.NET应用间HTTPS API请求JSON内容的实用方法
因为你拥有服务器和证书的完全权限,不用折腾MITM代理,下面几个方法更直接高效:
方法1:用IIS失败请求跟踪(Failed Request Tracing)
这是IIS原生功能,无需额外工具,专门用来捕获错误请求的详细信息:
- 打开IIS管理器,找到发起请求的目标站点,右键选择失败请求跟踪规则,点击添加
- 配置跟踪条件:比如选择“状态代码”,输入
400-599(覆盖无效字符导致的错误状态),或者指定特定的API路径(比如/api/*) - 配置跟踪字段:在“要跟踪的提供程序”里,确保勾选WWW服务器下的
Request Entity(请求实体),这样就能捕获POST/PUT的JSON请求体 - 触发API调用,生成的跟踪日志默认存在站点根目录的
trace文件夹里,用浏览器打开日志文件,就能看到完整的请求内容,包括未编码的字符
方法2:临时扩展.NET应用的HttpClient日志
如果应用用HttpClient发起API调用,只需简单配置或加少量临时代码就能捕获请求体:
针对.NET Core/.NET 5+
在appsettings.json里添加日志配置,把HttpClient的日志级别设为Debug:
"Logging": { "LogLevel": { "Default": "Information", "System.Net.Http.HttpClient": "Debug" } }
重启应用后,日志会输出请求的完整细节,包括JSON请求体,直接查看应用的日志文件即可。
针对.NET Framework
可以临时添加一个日志Handler,捕获请求体并写入本地文件:
public class RequestLoggingHandler : DelegatingHandler { protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { if (request.Content != null) { var requestBody = await request.Content.ReadAsStringAsync(); // 写入服务器本地目录,确保应用池账户有读写权限 File.AppendAllText(@"C:\temp\api_request_logs.txt", $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] Request Body: {requestBody}{Environment.NewLine}"); } return await base.SendAsync(request, cancellationToken); } }
然后给HttpClient注册这个Handler:
var httpClient = new HttpClient(new RequestLoggingHandler()) { BaseAddress = new Uri("https://target-api-url/") };
测试完成后,记得移除这段代码,避免长期写入日志占用资源。
方法3:用Netsh捕获并解密HTTPS流量
Windows自带的Netsh可以捕获内网流量,结合你持有的证书,能直接解密HTTPS请求:
- 以管理员身份打开命令提示符,运行以下命令开始捕获:
netsh trace start capture=yes tracefile=C:\temp\api_traffic.etl maxsize=2048
- 触发API调用,完成后停止捕获:
netsh trace stop
- 用事件查看器打开生成的
.etl文件,或用Microsoft Message Analyzer分析,因为你有服务器的证书,软件会自动解密HTTPS流量,找到对应的API请求后就能查看JSON内容。
注意事项
- 确保应用程序池的账户(比如
IIS AppPool\YourAppPoolName)对日志目录有读写权限,避免写入失败 - 测试完成后,记得关闭IIS失败请求跟踪或恢复日志配置,防止日志文件过多占用磁盘空间
内容的提问来源于stack exchange,提问作者back_ache
相关产品推荐
相关产品推荐

