Тайм-аут сеанса 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 ответ

Решение

Данное исключение возникает при вызове utilCreateResponseAndBypassServer после того, как уже отправил запрос на сервер. Если вы хотите использовать utilCreateResponseAndBypassServer метод, вы должны сделать это внутри BeforeRequest обработчик, а не в будущем. Аналогично, настройка bBufferResponse после того как уже подключился к серверу бессмысленно.

Исходя из ваших более поздних замечаний, вы неправильно понимаете, как работает многопоточность с FiddlerCore. FiddlerCore обрабатывает сеансы в фоновых потоках потоков.

  • когда BeforeRequest срабатывает, у вашего кода есть шанс на запуск. Если вы позвоните utilCreateResponseAndBypassServer внутри этого метода генерируемый вами ответ немедленно возвращается клиенту.

  • Если ты не позвонишь utilCreateResponseAndBypassServer внутри BeforeRequestзапрос FiddlerCore немедленно отправляется на сервер, а ответ возвращается клиенту, когда он становится доступным.

Чтобы достичь того, что вы описываете, вы НЕ должны пытаться делать свои собственные потоки - вместо этого выполняйте всю свою работу с потоком, который входит в метод BeforeRequest, и не оставляйте этот метод без генерации желаемого ответа. Вам не нужно беспокоиться о том, чтобы повесить пользовательский интерфейс или что-то подобное, потому что BeforeRequest работает в фоновом потоке. Единственное, что вы должны сделать, это Invoke методы, если любой ваш код должен взаимодействовать с любым пользовательским интерфейсом, принадлежащим потоку пользовательского интерфейса.

Другие вопросы по тегам