Тайм-аут сеанса 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
методы, если любой ваш код должен взаимодействовать с любым пользовательским интерфейсом, принадлежащим потоку пользовательского интерфейса.