2010-12-01 7 views
6

Ich möchte die Anfragen an meine Anwendung "http://example.com/washishpath" von einem benutzerdefinierten HttpHandler aber die Dinge abhängig von dem Wert von "whateverpath" zurückgeben.asp.net benutzerdefinierte HttpHandler und URL-Routing

So erhalten Benutzer, die auf "http://example.com/path1" zugreifen, andere Antworten als Benutzer, die auf "http://example.com/path2" zugreifen, aber beide Anforderungen müssen in demselben HttpHandler behandelt werden. Die Idee ist, "whilepathpath" in einer Datenbank zu finden und abhängig vom Ergebnis den Antwortinhalt zurückzugeben.

Ich höre über URL-Routing und ich habe bereits einen benutzerdefinierten Http-Handler arbeiten, aber kann ich beide Techniken kombinieren, um zu bekommen, was ich brauche?

Ich freue mich über jeden Kommentar dieses Problem zu respektieren.

Prost Frank Abel

Antwort

4

Damit Sie eine Klasse, die IHttpHandler genannt implementiert: MyHandler und es ist im Namensraum Example, müssen Sie die folgenden Einträge in der Website Web.Config im httpHandlers Abschnitt machen:

<httpHandlers> 
    <add verb="*" path="*" type="Example.MyHandler"/> 
</httpHandlers> 

Da diese alle URLs umleitet Für Ihre Website/Anwendung zu Ihrem Handler müssen Sie überlegen, wie Sie statische Inhalte (Imgs, Skripte, Stylesheets usw.) bereitstellen können. Eine Möglichkeit ist, eine solche statische Inhalte in einer einheitlichen URL zu speichern, wie http://example.com/static/..., können Sie dann Ihren Handler als solche eingestellt:

<httpHandlers> 
    <add verb="*" path="*" type="Example.MyHandler"/> 
    <add verb="GET,HEAD" path="static/*" type="System.Web.StaticFileHandler" /> 
</httpHandlers> 

Für Ihren lokalen dev Webserver (Embedded in Visual Studio) dies ist alles, was benötigt wird. Für IIS müssen Sie IIS außerdem mitteilen, wie mit diesen URLs verfahren wird (da der Server zuerst eine Anfrage analysiert, um zu entscheiden, wohin er gesendet werden soll - einschließlich, ob er an ASP.NET oder eine andere Erweiterung gesendet werden soll).

  • Geöffnet: IIS-Manager ->
  • Abschnitt: Websites ->
  • Recht auf Ihrer Website klicken ->
  • Option: Eigenschaften ->
  • Tab: Home Directoy ->
  • Schaltfläche: [Konfiguration ...] ->
  • Registerkarte: Zuordnungen ->
  • Abschnitt: "Wildcard-Anwendungskarten (Reihenfolge der Implementierung) : "->
  • Schaltfläche: [Einfügen ...] ->
  • Executable: "C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ aspnet_isapi.dll" (oder was auch immer Version des .NET-Runtime-Handler verwendet) ->
  • Uncheck „Stellen Sie sicher, dass Datei existiert“->
  • Button: [OK]

Jetzt IIS und ASP.NET wissen, wie mit Ihrem URLS beschäftigen.

Der obige Ansatz bedeutet, dass bei der Anforderung von statischen Dateien, ASP.NET tatsächlich die Dateien, nicht IIS dient - was zu einigen Nachteilen führt (diskutiert here). Sie können dieses Verhalten überschreiben (die Zuordnung von Platzhaltern aus dem statischen Verzeichnis deaktivieren), indem Sie das Verzeichnis in eine Anwendung (im IIS-Manager) umschalten, die oben hinzugefügte Wildcard-Mapping-Anweisung entfernen und sie aus einer Anwendung zurückschalten. Voilà - statische Dateien werden von IIS behandelt, ohne Ihren ASP.NET zu belästigen.

0

ich nicht empfehlen URL-Routing und HTTP-Handler zu kombinieren.

Dies scheint wie ein perfekter Job für URL-Routing. Ich würde jedoch keinen HTTP-Handler dafür verwenden.

Ordnen Sie "~/CustomData/whateverpathpath" einfach einer ASPX-Seite zu. Lassen Sie dann die Seite die Daten aus der Datenbank laden. Wenn die Logik zum Nachschlagen der Daten gleich ist, unabhängig davon, was "whateverpath" ist, möchten Sie Ihre Logik nicht für jede Variation wiederholen. Stattdessen möchten Sie es einer einzelnen Datei zuordnen, die die richtigen Daten für alle Fälle lädt.

HTTP-Handler sind eine ganz andere Sache und sollten nicht für diesen Zweck verwendet werden. (BTW, ich habe gerade einen Artikel über HTTP-Handler veröffentlicht. Sie können es unter http://www.blackbeltcoder.com/Articles/asp/writing-a-custom-http-handler-in-asp-net ansehen).

+0

Können Sie erklären "Ich würde keinen HTTP-Handler dafür verwenden."? Soweit ich weiß HTTP-Handler bieten eine bessere Leistung als eine normale ASPX-Seite und ich sehe keinen Nachteil der HTTP-Handler Weg. –

+0

Seitenrouting ist einfacher und bietet mehr Flexibilität. Es wurde genau für das entwickelt, was Sie beschrieben haben. Es ist möglich, dass ein HTTP-Handler schneller ist, aber das liegt daran, dass ein Teil der Unterstützung für ASP.NET-Seiten nicht ausgeführt/geladen wird. Ich habe gerade einen benutzerdefinierten HTTP-Handler implementiert. Es funktioniert großartig. Aber ich denke nicht, dass es der richtige Ansatz für das ist, was Sie beschrieben haben. –

+0

Vielen Dank für Ihre Antwort ... können Sie mehr ausarbeiten, was Sie mit "geradlinig und bietet mehr Flexibilität"? Ich sehe HTTP-Handler-Ansatz sehr einfach und unkompliziert. Können Sie genauer bestimmen, wie die URL-Routing-Lösung aussieht? Rudu war sehr ausführlich in seiner Antwort. Danke nochmal Jonathan. –

0

Zunächst einmal würde ich dem vorherigen Beitrag von Jonathan Wood zustimmen, dass die Verwendung von Routing innerhalb von HttpHandler keine gute Idee ist. Aber ich bin mir ziemlich sicher, dass er sich dort auf das Standard-MVC-Routing bezogen hat.

Ein guter Ansatz wäre benutzerdefinierte Routing zu verwenden. Ich habe einen Artikel darüber veröffentlicht - Basic Routing for HttpHandler

Verwandte Themen