2008-09-16 81 views
15

是否有排除使用HTTP模塊的某些頁面的好方法?排除使用HTTPModule的某些頁面

我有一個應用程序使用自定義HTTP模塊來驗證會話。該HTTP模塊設置像這樣的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

您可以使用HTTPHandler而不是HTTPModule。處理程序允許您在Web.Config中聲明它們時指定路徑。

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

如果你必須使用一個HttpModule,你可以只檢查請求的路徑,如果它是一個被排除在外,繞過驗證。

+0

我正在使用這種方法,它只是不工作。不知道這是如何被接受的答案。 – Kehlan 2014-05-29 20:38:52

+0

我嘗試使用處理程序,但它似乎不適用作爲處理程序重新路由http上下文。我問在這裏:http://stackoverflow.com/questions/27124737/asp-net-httphandler-prevents-page-from-loading?noredirect=1#comment42750773_27124737 – user1531921 2014-11-25 12:12:50

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

總體思路是在配置文件中究竟應該被處理(或從處理除外)指定和使用的配置參數中模塊。