2008-09-16 41 views
15

Có cách nào tốt để loại trừ các trang nhất định không sử dụng mô-đun HTTP không?Loại trừ một số trang nhất định sử dụng HTTPModule

Tôi có một ứng dụng sử dụng mô-đun HTTP tùy chỉnh để xác thực phiên. Các HTTPModule được thiết lập như thế này trong cấu hình web:

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

Để loại trừ các module từ trang này, tôi đã cố gắng làm điều này (không thành công):

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

Bất kỳ suy nghĩ?

Trả lời

11

Bạn có thể sử dụng HTTPHandler thay vì HTTPModule. Trình xử lý cho phép bạn chỉ định đường dẫn khi bạn khai báo chúng trong Web.Config.

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

Nếu bạn phải sử dụng HTTPModule, bạn chỉ có thể kiểm tra đường dẫn của yêu cầu và loại trừ yêu cầu, bỏ qua xác thực.

+0

Tôi đang sử dụng cùng một phương pháp này và nó không hoạt động. Không chắc đây là câu trả lời được chấp nhận. – Kehlan

+0

Tôi đã thử sử dụng trình xử lý thay vào đó nhưng dường như nó không được áp dụng khi trình xử lý định tuyến lại ngữ cảnh http. Tôi hỏi về nó ở đây: http://stackoverflow.com/questions/27124737/asp-net-httphandler-prevents-page-from-loading?noredirect=1#comment42750773_27124737 – user1531921

13

HttpMô-đun tự gắn với đường dẫn xử lý yêu cầu ASP.NET. Bản thân httpModule phải quan tâm đến việc tìm ra các yêu cầu mà nó muốn hành động và yêu cầu nào nó muốn bỏ qua.

Điều này có thể đạt được bằng cách xem thuộc tính context.Request.Path.

5

Dưới đây là một số ví dụ đơn giản về cách lọc yêu cầu theo tiện ích mở rộng ... ví dụ bên dưới loại trừ khỏi các tệp xử lý có tiện ích mở rộng cụ thể. Lọc theo tên tập tin sẽ trông gần như giống với một số thay đổi nhỏ ...

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

ý tưởng chung là để xác định trong tập tin cấu hình chính xác những gì cần được xử lý (hoặc loại trừ khỏi chế biến) và sử dụng tham số cấu hình trong mô-đun.

+0

Câu hỏi cũ, nhưng câu trả lời tuyệt vời và mã mẫu! Chỉ có gợi ý từ tôi là sử dụng 'HastSet <>' thay cho 'List <>' cho extensionsToSkip, điều này sẽ dẫn đến tra cứu nhanh hơn và không có bản sao. – BenSwayne

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