2009-02-04 12 views
17

Wie kann eine Methode auf einer ASP.NET-Website am schnellsten ausgeführt werden?Etwas schneller als HttpHandlers?

Das Szenario ist ziemlich einfach: Ich habe eine Methode, die ausgeführt werden soll, wenn eine Webseite getroffen wird. Nichts anderes passiert auf der Seite, die einzige gerenderte Ausgabe ist eine "fertig" -Meldung. Ich möchte, dass die Verarbeitung so schnell wie möglich verläuft.

Jeder einzelne Treffer ist einzigartig, daher ist Caching keine Option.

Mein Plan ist, einen HttpHandler zu verwenden und es in web.config (Mypage.ashx) anstelle einer regulären ASPX-Seite zu konfigurieren. Dies sollte den Overhead deutlich reduzieren.

Also meine Frage ist wirklich: Gibt es einen schnelleren Weg, dies zu erreichen als mit HttpHandlers?

Antwort

25

Je nachdem, was Sie tun, würde ich nicht erwarten, eine Menge Verbesserung gegenüber nur mit einem HttpHandler zu sehen. Ich würde damit beginnen, einfach den HttpHandler zu schreiben und zu sehen, wie er funktioniert. Wenn Sie es schneller benötigen, sollten Sie sich genauer ansehen, was Sie tatsächlich tun, während Sie die Anfrage bearbeiten und sehen, was optimiert werden kann. Wenn Sie beispielsweise eine Protokollierung in einer Datenbank durchführen, sollten Sie versuchen, in eine lokale Datenbank statt in ein Netzwerk zu schreiben. Wenn es immer noch nicht schnell genug ist, dann schau vielleicht in etwas niedrigeres Level. Bis zu diesem Punkt würde ich bei dem bleiben, was am einfachsten für dich ist.

Als Referenz habe ich einen Ad Server in ASP.NET (mit HttpHandlers) geschrieben, der eine Anzeige (einschließlich Targeting und Protokollierung der Impression in einer lokalen Datenbank) in 0-15ms unter Last liefern kann. Ich dachte, ich würde ziemlich viel verarbeiten - aber das ist eine ziemlich gute Reaktionszeit IMHO.


Update nach mehreren Monaten:

Wenn Sie alle die Httpmodules, die standardmäßig enthalten sind, wird dies eine angemessene Menge an Overhead zu entfernen. Standardmäßig werden die folgenden Httpmodules in jedem Ort über das Computerebene web.config-Datei enthalten:

  • Output
  • Session (für den Sitzungszustand)
  • WindowsAuthentication
  • FormsAuthentication
  • PassportAuthentication
  • RoleManager
  • UrlAuthorization
  • FileAuthorization
  • anonymousIdentification
  • Profil
  • Fehlerbehandler
  • Servicemodel

Wie ich schon oben gesagt, mein Ad-Server nicht von diesen nicht verwendet, also habe ich nur das in dieser App getan Netz.config:

<httpModules> 
    <clear /> 
</httpModules> 

Wenn Sie einige von denen brauchen, aber nicht alle, Sie diejenigen, entfernen Sie nicht brauchen:

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

ASP.NET MVC Hinweis: ASP.NET MVC erfordert das Session-State-Modul, es sei denn, Sie tun etwas, um es zu umgehen. Siehe diese Frage für weitere Informationen: How can I disable session state in ASP.NET MVC?

Update für IIS7: Leider sind die Dinge in IIS7 nicht ganz so einfach. Hier ist how to clear HTTP Modules in IIS7

+0

Sie sind tot: Ich werde einige Protokollierung in einer Datenbank durchführen. Und ich plante, winzige Textdateien zu erstellen, anstatt zur db zu gehen. Die Dateien würden später verarbeitet werden. Aber basierend auf Ihrer Erfahrung und der beeindruckenden Reaktionszeit, die Sie erreicht haben, werde ich einfach mit einem einfachen HttpHandler- und DB-Zugriff fortfahren. –

+1

Wir haben eine SQL Express-Instanz auf die Web-Server geschrieben, in die geschrieben wird, und dann gibt es einen Job, der alle Daten von den Webserver-Instanzen in unseren SQL-Hauptserver zieht. –

+0

Super, danke für das Update. Sehr hilfreich. –

1

Ich bin mir nicht sicher, was Ihr genaues Szenario ist, aber wenn alle Ihre Seite gerade einige Daten verarbeitet, brauchen Sie nicht wirklich eine aspx-Seite oder eine http-Handler überhaupt. Sie könnten einen ASMX-Webdienst oder einen WCF-Dienst schreiben, um das zu tun, was Sie benötigen, und dies würde höchstwahrscheinlich weniger Aufwand verursachen. Der WCF-Dienst muss nicht einmal in ASP.NET gehostet werden. Sie können es von einer Windows-Dienst- oder Konsolenanwendung aus hosten und es mithilfe von Named Pipes in-proc aufrufen. Dies würde wahrscheinlich den Aufwand für den Aufruf des Datenverarbeitungscodes signifikant reduzieren.

+0

Guter Ruf, es kam mir nicht in den Sinn, dass dies ein interner Prozess sein könnte. Ich denke, wir müssen mehr darüber wissen, was er macht. –

+0

Ich werde einige AJAX/Javascript-Sachen machen, wo ich clientseitige Ereignisse auf dem Server registrieren muss. Ich bin mir nicht ganz sicher, wie ich die WCF-Service-Methode von js ausführen würde, aber ich werde definitiv etwas darüber googeln. :) Für jetzt ist HttpHandlers wahrscheinlich die beste Lösung für mich. Vielen Dank für Ihre Antworten. –

+0

Das Aufrufen eines WCF-Dienstes von js ist tatsächlich einfacher, als Sie vielleicht denken, besonders wenn Sie sich nicht mit einem Rückgabewert befassen müssen (einfach feuern und vergessen). Weitere Informationen finden Sie unter http://msdn.microsoft.com/en-us/library/bb514961.aspx. – davogones

0

Wenn Sie wirklich asp.net verwenden müssen, können Sie auch einfach in AuthorizeRequest Schritt einhaken und die Anfrage von dort abfangen, Ihre Verarbeitung und schreiben Sie Ihre Fertig Antwort direkt.