2014-06-20 38 views
0

我正在嘗試編寫一個捕獲HTTP獲取請求的程序。 我發現提琴手核心天才圖書館應該做我想要的。代理或FiddlerCore

的事情是,我試圖執行無效FiddlerApplication_BeforeRequest(會話oSession)內一大塊的代碼工作,它似乎要禁止所有的請求,損害我的衝浪速度很大。

我試圖用線程/任務無濟於事。 我在做什麼錯?

這是我的代碼:

public event RequestCapture RequestCaptured; 
private CancellationTokenSource cancelTokenSource = new CancellationTokenSource(); 

//...stat public function: 
public void RunWatch() { 
    Fiddler.FiddlerApplication.BeforeRequest += FiddlerApplication_BeforeRequest; 
    Fiddler.FiddlerApplication.Startup(0, FiddlerCoreStartupFlags.Default); 
} 

void FiddlerApplication_BeforeRequest(Session oSession) 
{ 
    if (RequestCaptured != null) 
    { 
     CancellationToken ct = cancelTokenSource.Token; 
     Task.Factory.StartNew(() =>RequestCaptured(oSession.fullUrl), ct); 
     //Handle the event in a new thread, so the Listener will continue to listen 
    } 

} 

//close public function: 
public void Close() { 
    try 
    { 
     FiddlerApplication.Shutdown(); 
     cancelTokenSource.Cancel(); 
    } 
    catch { } 
} 

現在我有我不同的類,它這樣做:

public Form1() 
    { 
     Listiner = new HttpWatcher.Listner(); 
     Listiner.RequestCaptured += RequestCaptured; 

     Listiner.RunWatch(); 
    } 

    void RequestCaptured(string url) 
    { 
     System.Threading.Thread.Sleep(10000); 
    } 

編輯 的問題是:有沒有使用招核更好的辦法?還是我建立一個簡單的代理呢?使用別的東西?謝謝!

edit2 我編輯了代碼,所以它會填補缺失的部分。

+0

什麼是RequestCaptured? –

+0

對不起,它是一個大量工作的事件:),我會在30分鐘後發佈額外的代碼。對不起 – Ran

+0

什麼樣的工作?在請求可以繼續之前,工作是否需要完成?如果沒有,只需將事件數據放入隊列中並從處理程序返回......然後使用其他線程處理隊列。 – spender

回答

2

這裏要說明的是,FiddlerCore會在線程池線程上處理每個會話。如果您需要阻止行爲,則無需啓動額外的線程或類似的任何內容。如果您不需要以阻塞的方式處理事情,那麼可以隨意將數據排列在後臺隊列上,並使用任務或其他異步機制來執行處理。

當你說damage my surfing speed a great deal時,你應該準確解釋你的意思,以及在使用Fiddler而不是你的應用程序時是否看到不同的行爲。

+0

感謝大師埃裏克,我的問題是,當我添加此行System.Threading.Thread.Sleep(10000);互聯網停止10秒。當我評論這條線時。互聯網開始正常工作 – Ran

+0

但是@ L.B說得對。 BlockingCollection根據需要工作 – Ran

+1

@Ran:除非在代碼中某處出現同步錯誤,否則絕對沒有合理的解釋。會話在後臺線程上處理。 – EricLaw