FiddlerCore会话超时
本文关键字:超时 会话 FiddlerCore | 更新日期: 2023-09-27 17:50:51
我通过使用FiddlerCore处理本地请求。所有会话在Queue<Session>
中排队,由BackgroundWorker
处理。处理完成后,我希望通过使用已处理的会话发送一个响应,指示处理的成功或失败。问题是我得到太晚了,我们已经在与服务器对话错误。
这是FiddlerCore函数:
private static void FiddlerApplication_BeforeRequest(Session session)
{
if (session.hostname.ToLower() == "localhost")
{
LogHelper.WriteFormat("Local request {0} enqueued", session.id);
sessionsQueue.Enqueue(session);
if (!sessionWorker.IsBusy)
sessionWorker.RunWorkerAsync();
}
}
这是线程函数:
private static void sessionWorker_DoWork(object sender, DoWorkEventArgs e)
{
while (sessionsQueue.Count > 0)
{
if (sessionWorker.CancellationPending)
{
e.Cancel = true;
sessionsQueue.Clear();
LogHelper.Write("Shutting down, all requests canceled");
break;
}
currentSession = sessionsQueue.Dequeue();
LogHelper.WriteFormat("Processing request ID {0}", currentSession.id);
ProcessSession();
}
}
这是ProcessSession
函数末尾的代码:
{
...
currentSession.bBufferResponse = true;
currentSession.utilCreateResponseAndBypassServer();
currentSession.oResponse.headers.HTTPResponseStatus = "200 OK";
currentSession.oResponse["Content-Type"] = "text/html; charset=UTF-8";
currentSession.oResponse["Cache-Control"] = "private, max-age=0";
currentSession.utilSetResponseBody(responseBody);
}
我试图篡改会话的定时器和状态,但没有成功。
当您已经将请求发送到服务器后调用utilCreateResponseAndBypassServer
时,就会出现该异常。如果您想使用utilCreateResponseAndBypassServer
方法,您必须在BeforeRequest
处理程序的内部这样做,而不是在将来的某个时间。同样,在已经连接到服务器之后设置bBufferResponse
是没有意义的。
根据你后来的评论,你对线程如何与FiddlerCore工作有一个误解。FiddlerCore处理后台线程池线程的会话。
-
当
BeforeRequest
触发时,您的代码有机会运行。如果在该方法中调用utilCreateResponseAndBypassServer
,则生成的响应是立即返回给客户机的。 -
如果不在
BeforeRequest
中调用utilCreateResponseAndBypassServer
,则请求立即由FiddlerCore发送到服务器,并且响应在可用时返回给客户端。
要实现你所描述的,你不应该尝试做你自己的线程——相反,在进入BeforeRequest方法的线程上做你所有的工作,并且不要在没有生成所需响应的情况下离开该方法。你不需要担心挂起UI或类似的东西,因为BeforeRequest
在后台线程上运行。如果您的任何代码需要与UI线程拥有的任何UI交互,那么您必须做的唯一一件事就是Invoke
方法。