我通過使用FiddlerCore處理本地請求。所有會議排隊在Queue<Session>
並由BackgroundWorker
處理。處理完成後,我想通過使用已處理的會話發送響應,指示處理成功或失敗。問題是,我得到的太晚了,我們已經在與服務器錯誤進行通話。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();
}
}
這是在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);
}
我試圖篡改會議的定時器和狀態,但沒有成功。
我想獲得一個請求,將請求主體發送到打印機併發送響應,而打印成功。我得到了一個積累請求的隊列,一個後臺工作線程,它從隊列中獲取每個請求,打印它的主體併發送一個響應給請求發起者。我試圖在BeforeRequest處理程序中調用utilCreateResponseAndBypassServer函數,並在打印完成後發送響應,但在瀏覽器的響應中看不到任何主體。 – toy4fun
我想你誤解了FiddlerCore的工作原理。 BeforeRequest會觸發並且您的代碼有機會運行。如果您調用'utilCreateResponseAndBypassServer',那麼您生成的響應會立即返回給客戶端。如果您不這樣做,則該請求將通過FiddlerCore發送到服務器,並在響應可用時返回給客戶端。爲了實現你所描述的內容,你不應該嘗試去做你自己的線程 - 而是在進入BeforeRequest方法的線程中完成所有的工作,並且不要在沒有產生期望的響應的情況下離開那個方法。 – EricLaw
我很擔心BeforeRequest函數可以處理多少負載。沒有辦法積累會話,一個接一個地處理它們,並向發起者返回一個響應?我怎樣才能阻止請求被髮送到服務器,但是當我完成它時發送響應給瀏覽器? – toy4fun