Speaking URL’s mit IIS Express – URL Rewrite mit DBProvider auf lokaler Website (localhost)
Endlich! Nach viel Blut, Schweiss und Tränen hab ich eine Lösung für das folgende Problem gefunden: «Warum funktioniert das URL Rewriting mit DBProvider auf der Entwicklungs-Ebene nicht während auf dem Stage-Server keine Probleme auftreten?»
Zur Erklärung:
Wir setzen bei uns auf das sogenannte «Three level deployment»:
Entwicklung: Hier entwickeln wir – ohne Angst etwas kaputt zu machen. Über den Team Foundation Server laden wir das Projekt lokal herunter und checken es nach getaner Arbeit wieder auf den Team Foundation Server ein.
Stage: Hier wird der neue, fertiggestellte Code platziert. Somit können wir und auch der Kunde die Änderungen testen, bevor die Website effektiv released wird.
Live: Die Live Website – ohne Fehler und mit aktuellem Inhalt (hoffentlich).
Über das IIS URL Rewrite 2.0 generieren wir unsere «Speaking URL’s».
Aus http://www.in4out.ch/index.aspx?tab=123&cat=12&prd=3 wird damit dann zum Beispiel: http://www.in4out.ch/shop/category/product.
Die Verknüpfungen zwischen der «Speaking URL» und der «echten URL» sind in einer Datenbank abgelegt und werden mit einem DBProvider ausgelesen. Mehr Informationen zu den «Custom Provider» können hier gefunden werden: http://www.iis.net/learn/extensions/url-rewrite-module/using-custom-rewrite-providers-with-url-rewrite-module
Und jetzt zum Problem: Das funktioniert auf der Stage-Ebene bestens, während auf der Entwicklungs-Ebene folgender Fehler auftritt:
Für unsere Kunden war dies nicht wichtig, sie hatten nur Zugriff auf die Stage-Ebene, auf welcher das Rewriting funktioniert hat. Aber für uns Entwickler war das etwas mühsam, weil wir Verlinkungen mit «Speaking URL’s» so nur auf der Stage-Ebene testen konnten.
Erster Test meinerseits: Rewrite-Regeln einzeln testen. Alles klar, nur die DBProvider-Regel funktioniert lokal nicht.
Zweiter Test: Sind Berechtigungen für die DB richtig gesetzt? Spielt keine Rolle weil der Zugriff auf die Datenbank gar noch nicht passiert. (Getestet mit SQL Profiler)
Bestens: In dem Fall wird das RewriteModule mit dem IIS Express lokal nicht geladen.
Auf dem IIS mussten wir damals dieses Module zuerst installieren: http://www.iis.net/downloads/microsoft/url-rewrite. Hinter diesem Module steckt nichts weiter als die DLL Microsoft.Web.Iis.Rewrite.dll, welche sich im Ordner C:\Program Files\Reference Assemblies\Microsoft\IIS befindet.
Diese DLL kann nun einfach in das lokale Verzeichnis des IIS Express, C:\Program Files (x86)\IIS Express, kopiert werden. Nach dem Neustart des IIS Express und dem Aufruf der Website erhalten wir nun eine weitere Fehlermeldung:
Das Provider-Modul, welches für den DBProvider benötigt wird kann also nicht geladen werden. Es gibt zwei Möglichkeiten dieses Problem zu lösen:
- Installation der URL Rewrite Extensibility Samples, wie es hier beschrieben ist: URL Rewrite Extensibility Samples (Achtung, der dort beschriebene Link funktioniert nicht mehr: Direkt-Download)
- Oder man kopiert die daraus resultierende DLL Microsoft.Web.Iis.Rewrite.Providers.dll direkt in das lokale IIS Express-Verzeichnis C:\Program Files (x86)\IIS Express, analog von Microsoft.Web.Iis.Rewrite.dll
Download: Microsoft.Web.Iis.Rewrite.Providers.dll
Und tadaaaa: Nach erneutem Restart des IIS Express und dem Aufruf der Website funktioniert das URL Rewriting korrekt.