2017-05-08 57 views
1

很多人[1][2]Response.Redirect(url)不好,我們應該用Response.Redirect(url,false),因爲前者拋出異常並殺死線程,從而有可擴展性問題。如何衡量Response.Redirect(url)和Response.Redirect(url,false)的性能?

所以我想知道兩種方式之間的性能差異,以數值表示。

我創建了一個asp.net網頁,其唯一的代碼是Response.Redirect

I created a asp.net web page, whose only code is <code>Response.Redirect</code>

然後我寫了這個控制檯應用程序發出請求的頁面。

private const int concurrentRequests = 800; 

static void Main(string[] args) 
{ 
    Console.WriteLine("Type in the URL:"); 
    var url = Console.ReadLine(); 

    Console.WriteLine($"concurrentRequests={concurrentRequests}"); 

    ServicePointManager.DefaultConnectionLimit = concurrentRequests; 

    List<Task> tasks = new List<Task>(concurrentRequests); 

    Stopwatch watch = new Stopwatch(); 
    watch.Start(); 
    for (int i = 0; i < concurrentRequests; i++) 
    { 
     Task t = new Task(o => GetResponse((string)o), url); 
     tasks.Add(t); 
     t.Start(); 
    } 

    Task.WaitAll(tasks.ToArray()); 

    watch.Stop(); 
    Console.WriteLine($"Execution time: {watch.ElapsedMilliseconds}"); 
    Console.ReadKey(); 
} 

static void GetResponse(string url) 
{ 
    var request =(HttpWebRequest) WebRequest.Create(url); 
    request.AllowAutoRedirect = false; 
    var response = request.GetResponse(); 

    using (StreamReader sr = new StreamReader(response.GetResponseStream())) 
    { 
     var content = sr.ReadToEnd(); 
    } 
} 

我還在machine.config中將asp.net線程數減少到了4。

I set <processModel maxWorkerThreads="4" maxIoThreads="4"/> in machine.config

然而,事實的Response.Redirect(URL)需要350毫秒來執行,同時的Response.Redirect(網址,FALSE)需要415ms。

爲什麼結果不符合文章中的理論?

+0

總之,你應該強調時間。我的意思是每秒檢查一次請求。 – user960567

回答

1

這裏還有一個更重要的問題,這就是安全性。現在讓我說出爲什麼這個比另一個快。

緩慢和不安全的一個案例Response.Redirect(url,endRespose:false) 它是慢,因爲使用false參數你讓頁面的完整週期的運行,並呈現在客戶端!與重定向命令一起!所以這個頁面通常運行並且幾乎在客戶端頁面上呈現 - 因此速度較慢。

是拋出一個異常是停止其他處理,並停止頁面的呈現進一步的另一種情況 - 只留下重定向命令 - 和你有什麼渲染頁面到那個時候上。

關於這個問題和我的回答,我分析並證明,如果您停止頁面的重定向,則可以看到頁面的完整結果 - 如果您已使用false選項設置了重定向(,false)。

Redirect to a page with endResponse to true VS CompleteRequest and security thread

要關閉,我總是使用重定向與頁面的其餘部分過程的停止 - 但如果我用另外一個,讓我有處理的剩餘部分在我心中所有的上面 - 該頁面已呈現並且需要額外的時間。