2016-11-04 15 views
6

Tôi đã được hỏi một câu hỏi trong cuộc phỏng vấn rằng làm thế nào để thực hiện HTTP moduleHTTP handler trong ASP.Net MVC. Tôi biết rằng chúng được sử dụng trong ASP.Net để viết tiền xử lý trước khi trang aspx được gọi. Nhưng trong ASP.Net MVC chúng tôi có bộ lọc cho điều đó vì vậy tôi đã nói với họ rằng chúng tôi sử dụng Bộ lọc cho điều đó. Tôi đã trả lời đúng chưa?Mô-đun HTTP và trình xử lý HTTP trong ASP.Net MVC?

+0

Các bộ lọc được chỉ gọi cho các yêu cầu xử lý bởi bộ điều khiển. Nói chung, bạn sẽ phải sử dụng IHttpHandler và IHttpModule ... trừ khi bạn đang ở trong OWIN, trong trường hợp đó nó sẽ là một lớp OWIN Middleware. – Dai

+0

Tôi không đưa bạn đến đây. Tôi không chắc về OWIN –

Trả lời

5

Bộ lọc hành động cho phép bạn nối vào các sự kiện cụ thể của MVC trong khi mô-đun HTTP cho phép bạn nối vào các sự kiện ASP.Net, ngay cả trong MVC, để thực hiện Mô-đun HTTP và trình xử lý HTTP, bạn sẽ cần triển khai giao diện tương ứng. Ngoài ra, nếu bạn muốn chức năng của mình chỉ được thực hiện một lần cho mỗi Yêu cầu Http, bạn nên sử dụng một HttpModule. ActionFilters có thể được thực hiện nhiều lần trong một chuyến đi đến máy chủ. Để giải thích các mô-đun HTTP và Trình xử lý HTTP, mô-đun HTTP và trình xử lý HTTP được MVC sử dụng để chèn logic xử lý trước vào chuỗi yêu cầu.

Trình xử lý HTTP là bộ xử lý trước dựa trên tiện ích mở rộng trong khi Mô-đun HTTP là bộ tiền xử lý dựa trên sự kiện. Ví dụ: nếu bạn muốn thay đổi cách xử lý tệp jpg, bạn sẽ triển khai trình xử lý HTTP tùy chỉnh so với nếu bạn muốn thực thi logic bổ sung trong khi xử lý yêu cầu, bạn sẽ triển khai mô-đun HTTP tùy chỉnh. Chỉ có một trình xử lý HTTP cho một yêu cầu cụ thể nhưng có thể có nhiều mô-đun HTTP.

Để triển khai trình xử lý HTTP, bạn thực hiện IHTTPHandler lớp và triển khai các phương thức ProcessRequest và thuộc tính IsResuable. IsResuable thuộc tính xác định liệu trình xử lý có thể được sử dụng lại hay không.

public class MyJpgHandler: IHttpHandler { 
    public bool IsReusable { 
     get { 
      return false; 
     } 
    } 
    public void ProcessRequest(HttpContext context) { 
    } 
} 

Tiếp theo chúng ta cần phải xác định những loại yêu cầu sẽ được xử lý bởi bộ xử lý tùy chỉnh của chúng tôi trong web.config file:

<httpHandlers> 
    <add verb="*" path="*.jpg" type="MyJpgHandler"/> 
</httpHandlers> 

Để thực hiện một mô-đun HTTP, chúng ta cần phải thực hiện IHttpModule và đăng ký các sự kiện cần thiết theo phương thức init. Như một ví dụ đơn giản, nếu chúng ta muốn ghi lại tất cả các yêu cầu:

public class MyHttpModule: IHttpModule { 
    public MyHttpModule() {} 
    public void Init(HttpApplication application) { 
     application.BeginRequest += new EventHandler(this.context_BeginRequest); 
     application.EndRequest += new EventHandler(this.context_EndRequest); 
    } 
    public void context_BeginRequest(object sender, EventArgs e) { 
     StreamWriter sw = new StreamWriter(@ "C:\log.txt", true); 
     sw.WriteLine("request began at " + DateTime.Now.ToString()); 
     sw.Close(); 
    } 

    public void context_EndRequest(object sender, EventArgs e) { 
     StreamWriter sw = new StreamWriter(@ "C:\log.txt", true); 
     sw.WriteLine("Request Ended at " + DateTime.Now.ToString()); 
     sw.Close(); 
    } 
    public void Dispose() {} 
} 

Và đăng ký mô-đun của chúng tôi:

<httpModules> 
    <add name="MyHttpModule " type="MyHttpModule " /> 
</httpModules> 
Các vấn đề liên quan