2011-01-04 36 views
6

Thực thi dòng:
Response.Redirect ngoại lệ

Response.Redirect("Whateva.aspx", true);

Kết quả trong:

 
A first chance exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll 
An exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll but was not handled in user code 

Trường hợp ngoại lệ là vì phần "true", nói cho nó để kết thúc yêu cầu hiện ngay lập tức.

Đây có phải là cách thức như vậy không?
Nếu chúng ta xem xét:

  • Exceptions thường được coi là nặng, và nhiều lần lý do chấm dứt yêu cầu sớm là để tránh xử lý phần còn lại của trang.
  • Ngoại lệ hiển thị trong giám sát hiệu suất, do đó, theo dõi giải pháp sẽ hiển thị số lượng ngoại lệ sai.

Có cách nào khác để đạt được điều tương tự không?

+0

Câu hỏi quen thuộc: http://stackoverflow.com/questions/2777105/ –

Trả lời

6

Bạn nói đúng về thực tế là nhà phát triển nên tránh tăng (và bắt) ngoại lệ vì thời gian chạy thực thi tiêu tốn thời gian và bộ nhớ để thu thập thông tin về ngoại lệ cụ thể. Thay vào đó, anh ta (hoặc cô ta) không nên để chúng xảy ra (khi có thể).

Liên quan đến Response.Redirect: hành vi này là "theo thiết kế" nhưng bạn có thể muốn sử dụng giải pháp nổi tiếng. Vui lòng đọc this KB article.

- Pavel

+0

bài viết KB được tham chiếu giờ đây trống. –

+0

@EvoD Không chắc tôi hiểu, liên kết hoạt động và vẫn trỏ đến bài viết đúng về KB. – volpav

+0

Hrmmm, sai lầm của tôi. Nó xuất hiện cho tôi bây giờ. Lấy làm tiếc. –

6

Một cách tiếp cận tôi thường mất trong trường hợp này là không kết thúc câu trả lời trong thời gian phản ứng, nhưng để làm theo nó ngay lập tức với một return (hoặc kiểm soát dòng chảy khác). Một cái gì đó như thế này:

Response.Redirect("Whateva.aspx", false); 
return; 

Điều này phụ thuộc vào nơi chuyển hướng đang diễn ra trong luồng logic của bạn. Tuy nhiên bạn muốn xử lý nó là tốt. Nhưng ý tưởng là, khi bạn muốn kết thúc phản hồi trên chuyển hướng, thì thoát khỏi phương thức được đề cập qua một số return không nằm ngoài câu hỏi.

Một cách tiếp cận tôi thấy mọi người thường xuyên gặp vấn đề này, và không nên nói rằng điều này là tránh được, nhưng để hoàn thành, tôi sẽ nói điều đó (bạn không bao giờ biết ai có thể vấp ngã điều này câu hỏi sau qua Google, vv), là để nắm bắt và nuốt các ngoại lệ:

try 
{ 
    Response.Redirect("Whateva.aspx", true); 
} 
catch (Exception ex) 
{ 
    // do nothing 
} 

này, tất nhiên, nên không được thực hiện, đối với một số lý do. Khi tôi suy ra từ mô tả của bạn về ngoại lệ, bạn chắc chắn đã biết rằng điều này sẽ là thực hành xấu. Nhưng, như tôi đã nói, đáng chú ý là sự thật này trong câu trả lời.

0

Để làm việc xung quanh vấn đề này, sử dụng một trong các phương pháp sau:

Đối với Response.End, gọi phương thức HttpContext.Current.ApplicationInstance.CompleteRequest thay vì Response.End để bỏ qua thực thi mã đến Application_EndRequest biến cố.

Đối với Trả lời.Chuyển hướng, sử dụng tình trạng quá tải, Response.Redirect (Chuỗi url, bool endResponse) chuyển sai cho tham số endResponse để chặn cuộc gọi nội bộ thành Response.End.

Ví dụ: Response.Redirect ("nextpage.aspx", false);

Nếu bạn sử dụng giải pháp này, mã theo sau Response.Redirect được thực thi.

Đối với Server.Transfer, hãy sử dụng phương thức Server.Execute thay thế.

từ: http://support.microsoft.com/kb/312629/en-us

Cùng liên kết đăng bởi Volpav.

Trân trọng.