2008-09-16 11 views
15

特定のページをHTTPモジュールから除外する良い方法はありますか?特定のページをHTTPModuleから除外する

カスタムHTTPモジュールを使用してセッションを検証するアプリケーションがあります。 HttpModuleをはWeb構成でこのように設定されていますページからモジュールを除外するには

<system.web> 
    <!-- ... --> 
    <httpModules> 
    <add name="SessionValidationModule" 
     type="SessionValidationModule, SomeNamespace" /> 
    </httpModules> 
</system.web> 

、私は(成功せずに)これをやってみました:

<location path="ToBeExcluded"> 
    <system.web> 
    <!-- ... --> 
    <httpModules> 
     <remove name="SessionValidationModule" /> 
    </httpModules> 
    </system.web> 
</location> 

任意の考えを?

答えて

11

HTTPModuleではなくHTTPHandlerを使用できます。ハンドラは、Web.Configでそれらを宣言するときにパスを指定できます。

<add verb="*" path="/validate/*.aspx" type="Handler,Assembly"/> 

HTTPModuleを使用する必要がある場合は、要求のパスを確認し、除外する必要がある場合は検証をバイパスします。

+0

私はこの同じ方法を使用しています。それはうまく機能しません。これがどのように受け入れられた答えであるか分かりません。 – Kehlan

+0

代わりにハンドラを使用しようとしましたが、ハンドラがhttpコンテキストを再ルーティングするため、適切ではないようです。私はここでそれについて尋ねました:http://stackoverflow.com/questions/27124737/asp-net-httphandler-prevents-page-from-loading?noredirect=1#comment42750773_27124737 – user1531921

13

HttpModulesは、ASP.NET要求処理パイプライン自体に接続します。 httpModule自体は、どのリクエストを処理したいのか、どのリクエストを無視したいのかを判断する必要があります。

これは、たとえば、context.Request.Pathプロパティを調べることで実現できます。

5

ここでは、リクエストを拡張子でフィルタリングする簡単な例を示します。以下の例では、特定の拡張子を持つ処理ファイルから除外しています。ファイル名によるフィルタリングは、いくつかの小さな変更とほぼ同じになります...

public class AuthenticationModule : IHttpModule 
{ 
    private static readonly List<string> extensionsToSkip = AuthenticationConfig.ExtensionsToSkip.Split('|').ToList(); 

    // In the Init function, register for HttpApplication 
    // events by adding your handlers. 
    public void Init(HttpApplication application) 
    { 
     application.BeginRequest += new EventHandler(this.Application_BeginRequest); 
     application.EndRequest += new EventHandler(this.Application_EndRequest); 
    } 

    private void Application_BeginRequest(Object source, EventArgs e) 
    { 
     // we don't have to process all requests... 
     if (extensionsToSkip.Contains(Path.GetExtension(HttpContext.Current.Request.Url.LocalPath))) 
      return; 

     Trace.WriteLine("Application_BeginRequest: " + HttpContext.Current.Request.Url.AbsoluteUri); 
    } 

    private void Application_EndRequest(Object source, EventArgs e) 
    { 
     // we don't have to process all requests... 
     if (extensionsToSkip.Contains(Path.GetExtension(HttpContext.Current.Request.Url.LocalPath))) 
      return; 

     Trace.WriteLine("Application_BeginRequest: " + HttpContext.Current.Request.Url.AbsoluteUri); 
    } 
} 

一般的な考え方は、処理された(または処理から除外)する必要があります正確にどのような設定ファイルに指定したとしているconfigパラメータを使用することですモジュール。

+0

古い質問ですが、優れた回答とサンプルコード!私からの提案は、extensionsToSkipに 'List <>'の代わりに 'HastSet <>'を使うことだけです。これは検索の高速化と重複のない結果をもたらすはずです。 – BenSwayne

関連する問題