2008-10-27 129 views
8

根據this MSDN articleHttpApplication .EndRequest可用於關閉或處置資源。然而這個事件並沒有在我的應用程序中被解僱/調用。ASP.NET HttpApplication.EndRequest事件未被觸發

我們通過以下方式安裝的處理程序在Page_Load中:

HttpContext.Current.ApplicationInstance.EndRequest += ApplicationInstance_EndRequest; 

的唯一方法是使用Global.asax中Application_EndRequest處理程序,但這不是我們可以接受的。

+0

如果您提供了關於您嘗試處理哪些資源以及如何使用它們的更多信息,則有人可以告訴您應該在哪裏執行此操作。 – Will 2008-10-27 13:23:55

回答

14

如果你不想使用global.asax,你可以使用你自己的HttpModule來捕獲EndRequest。

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 
    } 
} 

您需要的模塊,一個更好的方式添加到您的web.config

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

這是怎麼回事?爲什麼事件不會在沒有httpmodule的情況下觸發? – mcintyre321 2009-05-13 21:09:50

1

該頁面可能在事件發生之前處置。您可能想嘗試在Page_Unload處理程序中完成您的工作。

+0

我們需要它在請求級別。我們已經有這方面的解決方法,但即時通訊的實際情況是,它並不按照MSDN文檔所述的方式工作: EndRequest事件始終在調用CompleteRequest方法時引發。 – Crank 2008-10-27 13:29:23

5

根據MSDN文檔,該事件在頁面完成後發生,就像BeginRequest一樣。因此,據我所知,不可能在頁面上捕獲這個

+0

對於調試器來捕捉這個事件可能會很棘手。但是我添加了一些未被調用的代碼(我確定)。 – Crank 2008-10-27 14:18:28

2

我相信這個鏈條事件提供了一個基類的Global.asax

Language="C#" Inherits="YourBaseClass" 

,然後覆蓋Init():

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

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

似乎正在爲我工​​作(抓住一個斷點),但我真的在做任何事情。

由於存在多個HttpApplication實例,因此在Page_load中進行設置可能會將其添加到非特定實例中。奇怪的是,我也注意到HttpApplication.Init()沒有被第一個HttpApplication實例(但是Application_start)調用。