2012-12-05 6 views
10

Tôi có một trang Response.Redirect trong trang Nhân viên của tôi. Nó chuyển hướng đến trang Lương.Có thể "EndResponse" tăng hiệu suất của trang ASP.Net

Response.Redirect ("Salary.aspx"); 

Nó hoạt động tốt cho đến khi tôi thêm xử lý ngoại lệ như dưới đây. .

try 
{ 
    Response.Redirect ("Salary.aspx"); 
} 
catch(Exception ex) 
{ 
//MyLog(); 
    throw new Exception(); 
} 

//Remaining code in event handler 

này gây ra một ngoại lệ mới nói "Chủ đề đã bị hủy bỏ” Tôi đến biết rằng điều này có thể tránh được bằng cách thiết lập endResponse như sai để chuyển hướng

Response.Redirect(url, false); 
Context.ApplicationInstance.CompleteRequest(); 

Giải thích về ngoại lệ mới.: Nó luôn luôn ném ngoại lệ nhưng được xử lý bởi khuôn khổ.Khi tôi thêm một try..catch nó đã bị bắt ở đó (và tôi ném một ngoại lệ mới)

Lưu ý: CompleteRequest bỏ qua các bộ lọc HTTP và mô-đun, nhưng nó không 't bypa ss sự kiện tiếp theo trong vòng đời trang hiện tại

Lưu ý: Phản hồi.Xin chuyển ngoại lệ này sang xử lý kết thúc của trang hiện tại. ASP .Net tự xử lý ngoại lệ này và gọi ResetAbort để tiếp tục xử lý.

HỎI

  1. dù “thiết endResponse như false” có thể tăng hiệu suất kể từ khi ngoại lệ được ném không?
  2. Liệu “đặt endResponse là sai” có thể giảm hiệu suất vì các sự kiện vòng đời trang không bị chấm dứt?

Pitfall

  1. Nếu bạn đặt endResponse như false, mã còn lại trong eventhandler sẽ được thực thi. Vì vậy, chúng ta cần phải thực hiện kiểm tra if cho mã còn lại (Kiểm tra: nếu tiêu chí chuyển hướng không được đáp ứng).

Reference

  1. Why Response.Redirect causes System.Threading.ThreadAbortException?
  2. ASP.NET exception "Thread was being aborted" causes method to exit
+0

'Hiệu suất' có thể đo lường từ các khía cạnh khác nhau !!! những gì bạn chính xác mong đợi? –

+0

@huMptyduMpty Hiệu suất từ ​​các quan điểm sau đây 1) Thời gian phản hồi của trang 2) Sử dụng bộ nhớ – Lijo

+1

Ngoài ra, vì bạn đang cố gắng cải thiện hiệu suất trang web của mình, [this] (http://msdn.microsoft.com/en-us/magazine/cc163854 .aspx) có thể cung cấp một số thông tin cũng như –

Trả lời

12

Kết thúc phản ứng (Response.Redirect(url) hoặc Response.Redirect(url, true)) sẽ không có hiệu suất tốt hơn so với Response.Redirect(url, false). Với false, vì bạn có quyền kiểm soát việc thực thi mã, bạn có thể chỉ cần không thực thi thêm bất kỳ mã nào trong trường hợp khi bạn định chuyển hướng người dùng.

này được quy định trong MSDN entry cho Response.Redirect():

Nếu bạn chỉ định đúng đối với các tham số endResponse, phương pháp này gọi là phương pháp End cho yêu cầu ban đầu, mà ném một ngoại lệ ThreadAbortException khi nó hoàn thành. Ngoại lệ này có ảnh hưởng bất lợi đến hiệu suất ứng dụng Web, đó là lý do tại sao truyền sai cho tham số endResponse được khuyến nghị.

Bạn KHÔNG cần quan tâm đến các sự kiện vòng đời trang, như bạn đã lưu ý. Bạn không nên tiếp tục thực hiện các sự kiện trang nếu bạn định chuyển hướng người dùng (không chỉ cho hiệu suất). Gần đây tôi đã viết một ví dụ ngắn gọn cho thấy what can happen với mã hóa/lập kế hoạch kém nếu bạn không.

Điểm mấu chốt của bài đăng đó là Response.Redirect() trả về 302 cho trình duyệt. Có khả năng xảy ra sự cố khi bạn sử dụng Response.Redirect(url, false) vì việc thực thi trang tiếp tục và người dùng có thể chọn bỏ qua 302 và thay vào đó xem trang sẽ hiển thị ... vì vậy bạn cần thực hiện các bước để đảm bảo không thấy bất cứ điều gì bạn không muốn họ nhìn thấy. Tiện ích mở rộng NoRedirect dành cho Firefox rất hữu ích khi thử nghiệm tính năng này.

Đối với hiệu suất tốt nhất: sử dụng "false" như tham số endResponse, đảm bảo bạn không chạy bất kỳ mã hơn nữa, và đảm bảo trang sẽ không làm cho bất kỳ thông tin mà bạn không muốn người dùng để xem họ bỏ qua 302.