我曾经使用另一个带有 C# 的代理服务器库来捕获 HTTP 请求,它只有一个AfterSessionComplete
在整个请求/响应操作全部完成后触发的事件,您可以获得主机、路径和查询、请求和响应正文全部来自事件参数。但是,该库前一段时间停止维护,因此我正在考虑切换到Titanium-Web-Proxy,并且似乎有一个AfterResponse
事件。这是我曾经测试过的:
private static async Task Server_AfterResponse(object sender, SessionEventArgs e)
{
try
{
Uri url = e.HttpClient.Request.RequestUri;
string method = e.HttpClient.Request.Method.ToUpper();
string req = e.HttpClient.Request.HasBody ? e.HttpClient.Request.BodyString : null;
string resp = e.HttpClient.Response.HasBody ? e.HttpClient.Response.BodyString : null;
ThreadPool.QueueUserWorkItem(new WaitCallback((s) =>
{
// Goes back to my old AfterSessionComplete method.
HttpProxy.AfterSessionComplete?.Invoke(url, method, req, resp);
}));
}
catch(Exception ex)
{
Debug.Print($"{ex}");
}
}
public static void Start(int port = 37123)
{
HttpProxy.server = new ProxyServer(false, false, false);
HttpProxy.server.AddEndPoint(new ExplicitProxyEndPoint(IPAddress.Any, port, false));
HttpProxy.server.AfterResponse += Server_AfterResponse;
HttpProxy.server.Start();
}
它不起作用。HTTP 流量会随机阻塞:一些请求不会触发AfterResponse
事件,在 Chrome DevTools 中显示为挂起并最终超时。即使向服务器发出请求,我也没有得到请求和响应正文,试图获取它们会触发异常,例如:
System.Exception: You cannot get the request body after request is made to server.
System.Exception: Response body is not read yet. Use SessionEventArgs.GetResponseBody() or SessionEventArgs.GetResponseBodyAsString() method to read the response body.
我也尝试过await GetRequestBodyAsString()
,await GetResponseBodyAsString()
但仍然没有。在那个阶段我很困惑,我应该怎么做?我是否需要放弃AfterResponse
并使用提供的其他活动?