2014-03-19 161 views
0

我通過使用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); 
} 

我試圖篡改會議的定時器和狀態,但沒有成功。

回答

0

當您在將請求發送到服務器之後調用utilCreateResponseAndBypassServer時,會發生異常。如果您想使用utilCreateResponseAndBypassServer方法,則必須在處理器內部處理程序,而不是在將來的某個時間。同樣,在已經連接到服務器之後設置bBufferResponse是毫無意義的。

根據您以後的評論,您對線程如何與FiddlerCore一起工作存在誤解。 FiddlerCore在後臺線程池線程上處理會話。

  • BeforeRequest發生火災時,您的代碼有機會運行。如果您在該方法內調用utilCreateResponseAndBypassServer,那麼您生成的響應是立即將返回給客戶端。

  • 如果你不叫utilCreateResponseAndBypassServerBeforeRequest,請求立即被FiddlerCore發送到服務器,當它的可用的響應返回給客戶端。

爲了達到你所描述的東西,你不應該試圖做你自己,而不是threading--做你該進入BeforeRequest方法的線程上的工作,不要離開這個方法,而不會產生期望的響應。您不必擔心掛起UI或類似的東西,因爲BeforeRequest正在後臺線程上運行。如果您的任何代碼需要與UI線程擁有的任何UI進行交互,則必須執行的唯一方法是Invoke方法。

+0

我想獲得一個請求,將請求主體發送到打印機併發送響應,而打印成功。我得到了一個積累請求的隊列,一個後臺工作線程,它從隊列中獲取每個請求,打印它的主體併發送一個響應給請求發起者。我試圖在BeforeRequest處理程序中調用utilCreateResponseAndBypassServer函數,並在打印完成後發送響應,但在瀏覽器的響應中看不到任何主體。 – toy4fun

+0

我想你誤解了FiddlerCore的工作原理。 BeforeRequest會觸發並且您的代碼有機會運行。如果您調用'utilCreateResponseAndBypassServer',那麼您生成的響應會立即返回給客戶端。如果您不這樣做,則該請求將通過FiddlerCore發送到服務器,並在響應可用時返回給客戶端。爲了實現你所描述的內容,你不應該嘗試去做你自己的線程 - 而是在進入BeforeRequest方法的線程中完成所有的工作,並且不要在沒有產生期望的響應的情況下離開那個方法。 – EricLaw

+0

我很擔心BeforeRequest函數可以處理多少負載。沒有辦法積累會話,一個接一個地處理它們,並向發起者返回一個響應?我怎樣才能阻止請求被髮送到服務器,但是當我完成它時發送響應給瀏覽器? – toy4fun