IHttpHandler so với IHttpModule


81

Câu hỏi của tôi rất đơn giản (mặc dù câu trả lời rất có thể sẽ không): Tôi đang cố gắng quyết định cách triển khai trình xử lý tải lên phía máy chủ trong C # / ASP.NET.

Tôi đã sử dụng cả HttpModules (giao diện IHttpModule) và HttpHandlers (giao diện IHttpHandler) và tôi thấy rằng tôi có thể thực hiện điều này bằng cách sử dụng một trong hai cơ chế. Tôi cũng xảy ra rằng tôi không hiểu sự khác biệt giữa hai điều này.

Vì vậy, câu hỏi của tôi là: Tôi sẽ chọn sử dụng IHttpHandler thay vì IHttpModule (và ngược lại) trong những trường hợp nào?

Một cái được thực thi cao hơn nhiều trong đường ống? Có dễ dàng cấu hình hơn nhiều trong một số tình huống nhất định không? Một cái không hoạt động tốt với bảo mật trung bình?


3
Nghiêm túc LOL'ed tại 'Tôi cũng xảy ra với tôi rằng tôi không hiểu sự khác biệt giữa hai. " Câu hỏi hay nhưng nó sẽ xứng đáng với một 1 chỉ cho :) rằng
JohnIdol

2
:-) Cảm ơn. Tôi thấy thật tốt khi thành thật về những điều tôi không biết.
Dan Esparza

1
Nếu không có câu hỏi, có sẽ có câu trả lời .. :)
Sprintstar

Câu trả lời:


70

Trình xử lý ASP.NET HTTP là quá trình (thường được gọi là "điểm cuối") chạy theo yêu cầu được gửi đến ứng dụng Web ASP.NET. Trình xử lý phổ biến nhất là trình xử lý trang ASP.NET xử lý tệp .aspx. Khi người dùng yêu cầu tệp .aspx, yêu cầu sẽ được trang xử lý thông qua trình xử lý trang. Bạn có thể tạo trình xử lý HTTP của riêng mình để hiển thị đầu ra tùy chỉnh cho trình duyệt.

Các cách sử dụng điển hình cho các trình xử lý HTTP tùy chỉnh bao gồm:

  • Nguồn cấp RSS Để tạo nguồn RSS cho một trang Web, bạn có thể tạo một trình xử lý phát ra XML có định dạng RSS. Sau đó, bạn có thể liên kết một phần mở rộng tên tệp như .rss với trình xử lý tùy chỉnh. Khi người dùng gửi yêu cầu đến trang web của bạn kết thúc bằng .rss, ASP.NET sẽ gọi trình xử lý của bạn để xử lý yêu cầu.
  • Máy chủ hình ảnh Nếu bạn muốn một ứng dụng Web cung cấp hình ảnh ở nhiều kích cỡ khác nhau, bạn có thể viết một trình xử lý tùy chỉnh để thay đổi kích thước hình ảnh và sau đó gửi chúng cho người dùng dưới dạng phản hồi của trình xử lý.

Một mô-đun HTTP là một hội đồng được kêu gọi mọi yêu cầu đó được thực hiện để ứng dụng của bạn. Các mô-đun HTTP được gọi như một phần của đường dẫn yêu cầu ASP.NET và có quyền truy cập vào các sự kiện vòng đời trong suốt yêu cầu. Các mô-đun HTTP cho phép bạn kiểm tra các yêu cầu đến và đi và thực hiện hành động dựa trên yêu cầu.

Cách sử dụng điển hình cho các mô-đun HTTP bao gồm:

  • Bảo mật Vì bạn có thể kiểm tra các yêu cầu đến, một mô-đun HTTP có thể thực hiện xác thực tùy chỉnh hoặc các kiểm tra bảo mật khác trước khi trang được yêu cầu, dịch vụ Web XML hoặc trình xử lý được gọi. Trong Dịch vụ Thông tin Internet (IIS) 7.0 chạy ở chế độ Tích hợp, bạn có thể mở rộng xác thực biểu mẫu cho tất cả các loại nội dung trong một ứng dụng.
  • Thống kê và ghi nhật ký Bởi vì mô-đun HTTP được gọi theo mọi yêu cầu, bạn có thể thu thập thống kê yêu cầu và thông tin nhật ký trong một mô-đun tập trung, thay vì trong các trang riêng lẻ.
  • Đầu trang hoặc chân trang tùy chỉnh Bởi vì bạn có thể sửa đổi phản hồi gửi đi, bạn có thể chèn nội dung như thông tin tiêu đề tùy chỉnh vào mỗi trang hoặc phản hồi dịch vụ Web XML.

Từ: http://msdn.microsoft.com/en-us/library/bb398986.aspx


16

Như đã nêu ở đây , HttpModules là các lớp đơn giản có thể tự cắm vào đường dẫn xử lý yêu cầu, trong khi HttpHandlers khác với HttpModules không chỉ vì vị trí của chúng trong đường dẫn xử lý yêu cầu mà còn vì chúng phải được ánh xạ tới một phần mở rộng tệp cụ thể.


bạn không cần để ánh xạ một handler để gia hạn nếu trong một HttpModule bạn một cách rõ ràng giải quyết để một lớp học mà cụ IHttpHandler
missaghi

@rizzle: ý bạn là "giải quyết rõ ràng cho một lớp triển khai IHttpHandler" là gì? Ý bạn là IHttpModule cũng là IHttpHandler?

3
@Ryan: Trong mô-đun, bạn có thể đính kèm một phương thức vào sự kiện HttpApplication.BeginRequest và cung cấp cho nó trình xử lý mà bạn chọn, bất kể phần mở rộng tệp là gì
missaghi

15

IHttpModulecho phép bạn kiểm soát nhiều hơn, về cơ bản bạn có thể kiểm soát tất cả lưu lượng truy cập trực tiếp đến ứng dụng Web của mình. IHttpHandlercung cấp cho bạn ít quyền kiểm soát hơn (lưu lượng truy cập được lọc trước khi nó đến tay trình xử lý của bạn), nhưng nếu điều này là đủ cho nhu cầu của bạn, thì tôi thấy không có lý do gì để sử dụng IHttpModule.

Dù sao, có lẽ tốt nhất nên đặt logic tùy chỉnh của bạn trong một lớp riêng biệt, và sau đó chỉ cần sử dụng lớp này từ một trong hai IHttpModulehoặc IHttpHandler. Bằng cách này, bạn không thực sự phải lo lắng về việc chọn cái này hay cái kia. Trong thực tế, bạn có thể tạo một lớp phụ trợ dụng cụ cả IHttpHandlerIHttpModulevà sau đó quyết định những gì để sử dụng bằng cách đặt nó trong Web.config.


Cảm ơn, bạn có thể giải thích điều đó một chút vì chúng tôi đang thêm xác thực tùy chỉnh vào máy chủ web cho các yêu cầu từ xa nhưng không sử dụng điều đó cho các máy chủ cục bộ không?
fkl

5

Các mô-đun nhằm xử lý các sự kiện do ứng dụng đưa ra trước và sau khi yêu cầu thực sự được xử lý bởi trình xử lý. Mặt khác, các trình xử lý không có cơ hội đăng ký bất kỳ sự kiện ứng dụng nào và thay vào đó, chỉ cần gọi phương thức ProcessRequest của họ để thực hiện công việc "chính" là xử lý một yêu cầu cụ thể.

Hãy xem tài liệu này của Microsoft (khoảng một nửa xuống trang trong phần "Yêu cầu được xử lý bởi đường dẫn HttpApplication"):

http://msdn.microsoft.com/en-us/library/bb470252.aspx

Bạn có thể thấy trong bước 15 nơi trình xử lý có cơ hội thực thi. Tất cả các sự kiện trước và sau bước đó đều có sẵn để đánh chặn bởi các mô-đun, nhưng không có trình xử lý.

Tùy thuộc vào những tính năng cụ thể mà bạn đang cố gắng đạt được, bạn có thể sử dụng trình xử lý hoặc mô-đun để triển khai trình xử lý tải lên. Bạn thậm chí có thể sử dụng cả hai.

Điều gì đó cần xem xét có thể sử dụng trình xử lý tải lên đã được viết sẵn.

Đây là một nguồn mở và miễn phí:

http://www.brettle.com/neatupload

Đây là một quảng cáo thương mại:

http://krystalware.com/Products/SlickUpload/

Nếu bạn xem tài liệu về NeatUpload, bạn sẽ thấy rằng nó yêu cầu bạn cấu hình một mô-đun.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.