2009-02-04 35 views
17

Cách nhanh nhất để thực hiện một phương thức trên một trang ASP.NET là gì?Thứ gì đó nhanh hơn HttpHandlers?

Kịch bản này khá đơn giản: Tôi có phương thức sẽ được thực thi khi trang web bị truy cập. Không có gì khác đang xảy ra trên trang, đầu ra được hiển thị duy nhất là thông báo "đã hoàn tất". Tôi muốn quá trình xử lý càng nhanh càng tốt.

Mỗi lần truy cập duy nhất là duy nhất, do đó, bộ nhớ đệm không phải là một tùy chọn.

Kế hoạch của tôi là sử dụng HttpHandler và định cấu hình nó trong web.config (mypage.ashx) thay vì trang .aspx thông thường. Điều này sẽ làm giảm đáng kể chi phí.

Vì vậy, câu hỏi của tôi thực sự là: Có cách nào nhanh hơn để thực hiện việc này hơn là sử dụng HttpHandlers không?

Trả lời

25

Tùy thuộc vào những gì bạn đang làm, tôi không mong đợi sẽ thấy nhiều cải tiến hơn chỉ bằng cách sử dụng HttpHandler. Tôi sẽ bắt đầu bằng cách viết HttpHandler và xem nó hoạt động như thế nào. Nếu bạn cần nó nhanh hơn, hãy thử xem xét kỹ hơn những thứ bạn đang thực sự thực hiện trong khi xử lý yêu cầu và xem những gì có thể được tối ưu hóa. Ví dụ: nếu bạn đang thực hiện bất kỳ việc ghi nhật ký nào vào cơ sở dữ liệu, hãy thử ghi vào cơ sở dữ liệu cục bộ thay vì qua mạng. Nếu nó vẫn không đủ nhanh, thì có thể nhìn vào viết một cái gì đó cấp thấp hơn. Cho đến thời điểm đó, tôi sẽ gắn bó với bất cứ điều gì dễ nhất để bạn viết.

Để tham khảo, tôi đã viết một máy chủ quảng cáo trong ASP.NET (sử dụng HttpHandlers) có thể phân phát quảng cáo (bao gồm nhắm mục tiêu và ghi lại hiển thị vào cơ sở dữ liệu cục bộ) trong 0-15ms dưới tải. Tôi nghĩ rằng tôi đã làm khá một chút về chế biến - nhưng đó là một thời gian phản ứng khá tốt IMHO.


Cập nhật sau vài tháng:

Nếu bạn rõ ràng tất cả các HttpModules được bao gồm theo mặc định, điều này sẽ loại bỏ một số tiền hợp lý của chi phí. Theo mặc định, HttpModules sau đây được bao gồm trong mỗi trang web thông qua các tập tin máy cấp web.config:

  • OutputCache
  • Session (cho trạng thái phiên)
  • WindowsAuthentication
  • FormsAuthentication
  • PassportAuthentication
  • RoleManager
  • UrlAuthorization
  • FileAuthorization
  • AnonymousIdentification
  • Hồ sơ
  • ErrorHandler
  • ServiceModel

Như tôi đã nói ở trên, máy chủ quảng cáo của tôi không sử dụng bất kỳ trong số này, vì vậy tôi đã chỉ làm điều này trong ứng dụng của web.cấu hình:

<httpModules> 
    <clear /> 
</httpModules> 

Nếu bạn cần một số của những người, nhưng không phải tất cả, bạn có thể loại bỏ những người bạn không cần:

<httpModules> 
    <remove name="PassportAuthentication" /> 
    <remove name="Session" /> 
</httpModules> 

ASP.NET MVC Lưu ý: ASP.NET MVC yêu cầu mô-đun trạng thái phiên trừ khi bạn làm điều gì đó cụ thể để giải quyết nó. Xem câu hỏi này để biết thêm thông tin: How can I disable session state in ASP.NET MVC?

Cập nhật cho IIS7: Thật không may, mọi thứ không đơn giản trong IIS7. Đây là how to clear HTTP Modules in IIS7

+0

Bạn đã chết: Tôi sẽ thực hiện một số lần đăng nhập vào cơ sở dữ liệu. Và tôi đã lên kế hoạch tạo các tệp văn bản nhỏ hơn là chuyển sang db. Các tệp sẽ được xử lý sau. Nhưng dựa trên kinh nghiệm của bạn và thời gian đáp ứng ấn tượng mà bạn đạt được, tôi sẽ tiếp tục với một HttpHandler và truy cập db đơn giản. –

+1

Những gì chúng tôi đã làm là đặt một thể hiện SQL Express trên các máy chủ web được ghi vào, và sau đó có một công việc kéo tất cả dữ liệu từ các cá thể máy chủ web vào máy chủ SQL chính của chúng tôi. –

+0

Tuyệt vời, cảm ơn bạn đã cập nhật. Rất hữu dụng. –

1

Tôi không chắc chắn kịch bản chính xác của bạn là gì, nhưng nếu tất cả các trang của bạn đang xử lý một số dữ liệu, bạn thực sự không cần trang aspx hoặc trình xử lý http. Bạn có thể viết một dịch vụ web ASMX hoặc dịch vụ WCF để làm những gì bạn cần và điều này rất có thể sẽ ít chi phí hơn. Dịch vụ WCF thậm chí không phải được lưu trữ trong ASP.NET. Bạn có thể lưu trữ nó từ một dịch vụ Windows hoặc ứng dụng giao diện điều khiển, và gọi nó trong proc bằng cách sử dụng các đường ống có tên. Điều này có lẽ sẽ làm giảm chi phí cho việc gọi mã xử lý dữ liệu một cách đáng kể.

+0

Cuộc gọi tốt, tôi không nghĩ rằng đây có thể là một quá trình nội bộ. Tôi đoán chúng ta cần biết thêm về những gì anh ấy đang làm. –

+0

Tôi sẽ thực hiện một số công cụ AJAX/javascript, nơi tôi cần đăng ký sự kiện phía máy khách trên máy chủ. Tôi không hoàn toàn chắc chắn làm thế nào tôi muốn thực hiện phương pháp dịch vụ WCF từ js, nhưng tôi sẽ làm một số googling về điều này, chắc chắn. :) Bây giờ HttpHandlers có lẽ là giải pháp tốt nhất cho tôi. Cảm ơn bạn vì sự ủng hộ của bạn. –

+0

Gọi một dịch vụ WCF từ js thực sự là dễ dàng hơn bạn nghĩ, đặc biệt là nếu bạn không cần phải đối phó với một giá trị trả lại (chỉ cháy và quên). Xem http://msdn.microsoft.com/en-us/library/bb514961.aspx để biết thêm thông tin. – davogones

0

Nếu bạn thực sự phải sử dụng asp.net, bạn cũng có thể chỉ cần móc vào bước AuthorizeRequest và chặn yêu cầu từ đó, xử lý và viết trực tiếp trả lời Hoàn tất của bạn.

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