次の方法で共有


パブリック イベントの処理

HttpApplication クラスによって発生したすべてのパブリック イベントは、構文 Application_EventName を使用してサポートされます。たとえば、Error イベントのハンドラは、protected void Application_Error(Object sender, EventArgs e) と宣言できます。非同期イベントのサポートも用意されています。

パブリック イベントには、HttpApplication によって発生するアプリケーション イベント、HttpModule によって発生するモジュール イベント、および HTTPApplication によって発生する非同期イベントの 3 種類があります。

アプリケーション イベント

アプリケーションの実行中に HttpApplication によって発生するイベントを次の表に示します。最初の表では、アプリケーションが実行される前に発生するイベントを示します。イベントは発生順になっています。

イベント 説明
BeginRequest 新しい要求を通知します。このイベントは、各リクエストに対して必ず発生します。
AuthenticateRequest 要求が認証可能な状態であることを通知します。セキュリティ モジュールによって使用されます。
AuthorizeRequest 要求が認証可能な状態であることを通知します。セキュリティ モジュールによって使用されます。
ResolveRequestCache キャッシュされた要求の処理をショートサーキットするために、キャッシュ モジュールによって使用されます。
AcquireRequestState 要求ごとの状態を取得する必要があることを通知します。
PreRequestHandlerExecute 要求ハンドラが実行される予定であることを通知します。最後のイベントであり、この要求の HttpHandler が呼び出される前に参加します。

アプリケーションが返された後に発生するイベントを次の表に示します。イベントは発生順になっています。

イベント 説明
PostRequestHandlerExecute HttpHandler が要求の処理を完了したことを通知します。
ReleaseRequestState アプリケーションが要求の処理を完了したため、要求の状態を保存する必要があることを通知します。
UpdateRequestCache コード処理が完了し、ファイルが ASP.NET キャッシュに追加できる状態になったことを通知します。
EndRequest 要求のすべての処理が完了したことを通知します。最後のイベントであり、アプリケーション終了後に呼び出されます。

さらに、順不同で発生する 3 種類の要求ごとのイベントがあります。それらのイベントを次の表に示します。

イベント 説明
PreSendRequestHeaders HTTP ヘッダーがクライアントに送信される予定であることを通知します。この通知によって、送信前に HTTP ヘッダーの追加、削除、または変更を行うことができます。
PreSendRequestContent コンテンツがクライアントに送信される予定であることを通知します。この通知によって、送信前にコンテンツを変更できます。
Error 処理されない例外を通知します。

モジュール イベント

構成で定義された HttpModule によって公開されているイベントに接続する (イベントをフックする) ことができます。たとえば、Machine.config は、すべてのアプリケーションに対して次の既定のモジュールを宣言します。

<httpModules>
    <add name="OutputCache" type="System.Web.Caching.OutputCacheModule, .../>
    <add name="Session" type="System.Web.SessionState.SessionStateModule, .../>
    <add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule, .../>
    <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule .../>
    <add name="PassportAuthentication" type="System.Web.Security.PassportAuthenticationModule .../>
    <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule, .../>
    <add name="FileAuthorization" type="System.Web.Security.FileAuthorizationModule, .../>
</httpModules>

いずれのクラスでも、そのクラスが定義するパブリック イベントを検索します。ModuleName**_OnEvent**Name 構文を使用して、それらのイベントを Global.asax 内でフックできます。たとえば、SessionStateModule モジュールの Start イベントは Global.asax で protected void Session_Start(Object sender, EventArgs e) と宣言されます。次に示すように、ASP.NET アプリケーション ファイルの <script runat=server> ブロック内にある構文 Session_OnStart を使用して、SessionStateModule のイベント ハンドラを定義できます。

<script language="VB" runat="server">
    Sub Session_OnStart()
        ' Session startup code goes here.
    End Sub
</script>

メモ 独自のカスタム モジュール内のフック イベントに対しても、そのイベントがアプリケーションの構成ファイルで宣言されている場合は、上記の ModuleName**_OnEvent**Name 構文を使用できます。

非同期イベント

HttpApplication 内の非同期イベントのイベント ハンドラは、Global.asax の AddAsynchronousEventName メソッドを呼び出すことによって明示的に接続される必要があります。たとえば、OnPostRequestHandlerExecuteAsync イベントの非同期ハンドラは、メソッド AddOnPostRequestHandlerExecuteAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler) を呼び出すことによってこのイベントに対して登録されます。ショートカット Application**_OnEvent**Name 構文は、同期イベントにだけ使用されます。HttpApplication 非同期イベントの宣言は、次のようになります。

void OnAcquireRequestStateAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
void OnAuthenticateRequestAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
void OnAuthorizeRequestAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
void OnBeginRequestAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
void OnEndRequestAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
void OnPostRequestHandlerExecuteAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
void OnPreRequestHandlerExecuteAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
void OnReleaseRequestStateAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
void OnResolveRequestCacheAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
void OnUpdateREquestCacheAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)

OnPostRequestHandlerExecuteAsync イベントの非同期ハンドラを作成するために Global.asax に含むことのできるコード ブロックの例を次に示します。

<%@ language=c# %>
<%@ import namespace="System.Threading" %>
<script runat=server>
public override void Init() {
    // Connect the asynchronous event PreRequestHandlerExecuteAsync.
    AddOnPreRequestHandlerExecuteAsync(
        new BeginEventHandler(this.BeginPreHandlerExecute), 
        new EndEventHandler(this.EndPreHandlerExecute));
}
IAsyncResult BeginPreHandlerExecute(Object source, EventArgs e, AsyncCallback cb, Object extraData) {
    AsynchOperation asynch = new AsynchOperation(cb, Context, extraData);
    asynch.StartAsyncWork();
    return asynch;
}
void EndPreHandlerExecute(IAsyncResult ar) {
}
class AsynchOperation : IAsyncResult {
    private bool _completed;
    private Object _state;
    private AsyncCallback _callback;
    private HttpContext _context;

    bool IAsyncResult.IsCompleted { get { return _completed; } }
    WaitHandle IAsyncResult.AsyncWaitHandle { get { return null; } }
    Object IAsyncResult.AsyncState { get { return _state; } }
    bool IAsyncResult.CompletedSynchronously { get { return false; } }

    public AsynchOperation(AsyncCallback callback, HttpContext context, Object state) {
        _callback = callback;
        _context = context;
        _state = state;
        _completed = false;
    }

    public void StartAsyncWork() {
        ThreadPool.QueueUserWorkItem(new WaitCallback(DoSomething), null /*workItemState*/);
    }

    private void DoSomething(Object workItemState) {
        _context.Items["PreHandlerExecute"] = "Hello World from Async PreHandleExecute!";
        _completed = true;
        _callback(this);
    }
}
</script>

参照

HTTP ランタイム サポート | HttpModule | カスタム HttpModule の例 | イベントの処理と発生