FiddlerCore会话超时

时间:2014-03-19 08:26:53

标签: c# session fiddler session-timeout fiddlercore

我正在使用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);
}

我试图篡改会话的计时器和状态,但没有成功。

1 个答案:

答案 0 :(得分:0)

在您已将请求发送到服务器后调用utilCreateResponseAndBypassServer时,会出现相关异常。如果您想使用utilCreateResponseAndBypassServer方法,则必须在<{em>} BeforeRequest处理程序中执行此操作,而不是在将来某个时间。同样,在连接到服务器之后设置bBufferResponse也毫无意义。

根据您之后的评论,您对线程如何与FiddlerCore一起使用存在误解。 FiddlerCore在后台线程池线程上处理Sessions。

  • BeforeRequest触发时,您的代码有机会运行。如果您在该方法中调用utilCreateResponseAndBypassServer,则您生成的响应会立即 返回给客户端。

  • 如果您未在utilCreateResponseAndBypassServer内拨打BeforeRequest,请求会立即由FiddlerCore发送到服务器,并且当客户端发出响应时,会将响应返回给客户端。可用。

要实现您所描述的内容,您不应该尝试自己的线程 - 而是在进入BeforeRequest方法的线程上完成所有工作,不要在不生成的情况下离开该方法期望的回应。您不必担心挂起UI或类似的东西,因为BeforeRequest正在后台线程上运行。如果您的任何代码需要与UI线程拥有的任何UI进行交互,那么您必须做的唯一事情是Invoke方法。