Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# FiddlerCore会话超时_C#_Session_Fiddler_Session Timeout_Fiddlercore - Fatal编程技术网

C# FiddlerCore会话超时

C# FiddlerCore会话超时,c#,session,fiddler,session-timeout,fiddlercore,C#,Session,Fiddler,Session Timeout,Fiddlercore,我用FiddlerCore处理本地请求。所有会话都在队列中排队,并由后台工作人员处理。处理完成后,我希望使用已处理的会话发送一个响应,指示处理的成功或失败。问题是我得到的时间太晚了,我们已经在与服务器交谈错误 这是FiddlerCore函数: private static void FiddlerApplication_BeforeRequest(Session session) { if (session.hostname.ToLower() == "localhost") {

我用FiddlerCore处理本地请求。所有会话都在
队列
中排队,并由
后台工作人员
处理。处理完成后,我希望使用已处理的会话发送一个响应,指示处理的成功或失败。问题是我得到的时间太晚了,我们已经在与服务器交谈错误

这是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();
    }
}
{
...        
    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);
}
这是线程函数:

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();
    }
}
{
...        
    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);
}
这是
ProcessSession
函数末尾的代码:

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();
    }
}
{
...        
    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在后台线程池线程上处理会话

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

  • 如果在请求之前的
    内未调用
    utilCreateResponseAndBypassServer
    ,则请求将立即通过FiddlerCore发送到服务器,响应将在可用时返回到客户端


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

我希望获得一个请求,将请求正文发送到打印机并发送响应,而不是打印成功。我得到了一个累积请求的队列,一个backgroundworker线程,它从队列中获取每个请求,打印其正文,并应该向请求发起人发送响应。我尝试在BeforeRequest处理程序中调用utilCreateResponseAndBypassServer函数,并在打印完成后发送响应,但在浏览器中的响应中没有看到任何主体。我认为您误解了FiddlerCore的工作原理。在请求触发之前,您的代码有机会运行。如果调用
utilCreateResponseAndBypassServer
,则生成的响应将立即返回到客户端。如果您没有,那么请求将通过FiddlerCore发送到服务器,响应将在可用时返回给客户端。为了实现您所描述的,您不应该尝试自己执行线程——而是对进入BeforeRequest方法的线程执行所有工作,并且在没有生成所需响应的情况下不要离开该方法。我担心BeforeRequest函数可以处理多大的负载。难道没有办法累积会话,一个接一个地处理它们,并将响应返回给启动器吗?我如何阻止请求发送到服务器,但在处理完请求后向浏览器发送响应?您应该按照我列出的步骤进行操作。如果你对这些有问题,我们可以讨论。我没有遇到你的方法的问题,所以我检查这个作为答案,谢谢。