【问题标题】:FiddlerCore session timeoutFiddlerCore 会话超时
【发布时间】:2014-03-19 08:26:53
【问题描述】:

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

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

【问题讨论】:

    标签: c# session fiddler session-timeout fiddlercore


    【解决方案1】:

    当您在已经将请求发送到服务器后调用utilCreateResponseAndBypassServer 时,会发生有问题的异常。如果您想使用utilCreateResponseAndBypassServer 方法,您必须在BeforeRequest 处理程序内部这样做,而不是在将来的某个时间。同样,在已经连接到服务器之后再设置bBufferResponse也是没有意义的。

    根据您后来的评论,您对线程如何与 FiddlerCore 一起工作存在误解。 FiddlerCore 在后台线程池线程上处理会话。

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

    • 如果你不在BeforeRequest里面调用utilCreateResponseAndBypassServer,FiddlerCore会立即将请求发送到服务器,并在响应可用时返回给客户端。

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

    【讨论】:

    • 我想获得一个请求,将请求正文发送到打印机并发送响应,而不是打印成功。我有一个累积请求的队列,一个后台工作线程,它从队列中获取每个请求,打印它的主体并应该向请求发起者发送响应。我尝试在 BeforeRequest 处理程序中调用 utilCreateResponseAndBypassServer 函数,并在打印完成后发送响应,但是我在浏览器的响应中看不到正文。
    • 我认为您误解了 FiddlerCore 的工作原理。 BeforeRequest 触发并且您的代码有机会运行。如果您调用utilCreateResponseAndBypassServer,那么您生成的响应会立即返回给客户端。如果不这样做,则 FiddlerCore 会将请求发送到服务器,并在响应可用时将响应返回给客户端。为了实现您所描述的,您不应该尝试做自己的线程 - 而是在进入 BeforeRequest 方法的线程上完成所有工作,并且不要在没有生成所需响应的情况下离开该方法。
    • 我担心 BeforeRequest 函数可以处理多少负载。难道没有办法积累会话,一个接一个地处理它们并返回响应给发起者吗?如何停止将请求发送到服务器,但在完成后向浏览器发送响应?
    • 您应该按照我列出的步骤进行操作。如果您对此有疑问,我们可以讨论。
    • 我没有遇到你的方法有问题,所以我正在检查这个作为答案,谢谢。
    猜你喜欢
    • 2010-12-05
    • 2010-12-25
    • 2015-10-10
    • 1970-01-01
    • 2013-07-04
    相关资源
    最近更新 更多