2008-10-27 39 views
8

Theo this MSDN articleHttpApplication .EndRequest có thể được sử dụng để đóng hoặc hủy tài nguyên. Tuy nhiên sự kiện này không bị sa thải/được gọi trong đơn của tôi.ASP.NET HttpApplication.EndRequest sự kiện không được bắn

Chúng tôi đang gắn các handler trong Page_Load theo cách sau:

HttpContext.Current.ApplicationInstance.EndRequest += ApplicationInstance_EndRequest; 

Cách duy nhất là sử dụng các handler Application_EndRequest trong Global.asax, nhưng điều này là không thể chấp nhận được đối với chúng tôi.

+0

Nếu bạn cung cấp thêm thông tin về những tài nguyên bạn đang cố gắng xử lý và cách bạn sử dụng chúng, ai đó có thể cho bạn biết nơi bạn nên thực hiện việc này. – Will

Trả lời

14

Bạn có thể sử dụng HttpModule của riêng mình để nắm bắt EndRequest nếu bạn không muốn sử dụng global.asax.

public class CustomModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.EndRequest += new EventHandler(context_EndRequest); 
    } 

    private void context_EndRequest(object sender, EventArgs e) 
    { 
     HttpContext context = ((HttpApplication)sender).Context; 
     // use your contect here 
    } 
} 

Bạn cần phải thêm các module vào web.config của bạn

<httpModules> 
    <add name="CustomModule" type="CustomModule"/> 
</httpModules> 
+1

Tại sao trường hợp này lại xảy ra? Tại sao sự kiện không kích hoạt trong httpmodule? – mcintyre321

+0

Đọc Mitchel Người bán trả lời, đó là lý do tại sao. Cách đơn giản là sử dụng global.asax, nhưng nếu bạn không thể sử dụng nó, bạn có thể đăng ký mô-đun của riêng bạn để nắm bắt yêu cầu. –

1

Trang có thể đang được xử lý trước khi sự kiện xảy ra. Bạn có thể muốn thử làm công việc của mình trong trình xử lý Page_Unload.

+0

Chúng tôi cần nó ở cấp độ Yêu cầu. Chúng tôi đã có workaround cho điều này, nhưng im interessed trong thực tế nó không phải là làm việc theo cách nó nên theo tài liệu MSDN mà nói: Sự kiện EndRequest luôn luôn được nâng lên khi phương pháp CompleteRequest được gọi. – Crank

5

Theo tài liệu MSDN, sự kiện này xảy ra SAU KHI trang hoàn tất, giống như BeginRequest. Vì vậy, theo như tôi biết không thể bắt được điều này ở cấp độ trang

+0

Một ý nghĩ có thể khó khăn cho trình gỡ rối để bắt sự kiện này. Nhưng tôi đã thêm một số mã không được gọi (tôi chắc chắn). – Crank

2

Tôi tin rằng một cách tốt hơn để chuỗi sự kiện này là bằng cách cung cấp một lớp cơ sở để global.asax

Language="C#" Inherits="YourBaseClass" 

và sau đó ghi đè Init():

public override void Init() 
{ 
    base.Init(); 

    BeginRequest += new EventHandler(OnBeginRequest); 
    EndRequest += new EventHandler(OnEndRequest); 
} 

dường như đang làm việc cho tôi (bắt một breakpoint) nhưng tôi thực sự làm bất cứ điều gì với nó.

Vì có nhiều cá thể HttpApplication, việc đặt nó trong Page_load có thể tiếp tục thêm nó vào một cá thể không cụ thể. Oddly, tôi cũng nhận thấy rằng HttpApplication.Init() không nhận được gọi là trường hợp HttpApplication đầu tiên (nhưng Application_start) nào.

Các vấn đề liên quan