ASP.NET Programmierung   ·   Microsoft MVP ASP/ASP.NET   ·   Peter Bucher   ·   Jürgen Gutsch   ·   Karsten Samaschke   ·   Microsoft ASP.NET
Willkommen bei ASP.NET Zone. Anmelden | Registrieren | Hilfe

ASP.NET 3.5 SP1: Bug im HyperLink Control bei UrlRewriting


Nachdem ich mir heute den Kopf über die Fehlermeldung:

Vorangestellte .. können nicht zum Beenden auf oberster Verzeichnisebene verwendet werden.

(für die Suchmaschinen hier dann auch noch auf Englisch :)

Cannot use a leading .. to exit above the top directory

zerbrochen und natürlich erstmal die Schuld bei mir gesucht habe, bin ich letztendlich nach langem Suchen dann doch drauf gekommen[1], dass das ein Bug im ASP.NET HyperLink Control ist.

Leider, leider ist der schon ziemliche lange bekannt[2] und wurde damals als nicht lösbar klassifiziert. Allerdings war das zu ASP.NET 2.0 Zeiten und die sind ja bekanntlich schon eine Weile her.

Was war passiert?

Ein Kunde wollte in einem Menücontrol zusätzlich zum Linktext auch noch ein Bild, welches ebenfalls verlinkt werden sollte. Nichts leichter als das, wozu gibt's <asp:HyperLink ... ImageUrl="~/Images/Bild.jpg" />?

Tja, leider kamen da noch einige andere Änderungen dabei, die dann auch gleich eingebaut wurden und so bin ich natürlich nicht gleich darauf gekommen, dass am HyperLink Control, bzw. dem ImageUrl Attribut liegen könnte, insbesondere, da das zum einen sowas banales ist, dass man nicht im Traum daran denkt, dass das nicht funktionieren würde und andererseits eine andere Website, die auf dem gleichen CMS aufbaut, weiterhin problemlos läuft (zugegebenermaßen ist obiges Konstrukt dort zu nicht finden, was mir aber halt leider nicht so ins Auge gefallen ist).

Normalerweise kommt die o.g. Fehlermeldung, wenn man bspw. mit ../ oder ähnlichem referenziert. Hab ich aber nicht (außer in externen CSS Dateien, die sollten aber eigentlich nicht vom IIS geparst werden). Also ging die Suche los.

Anleitung zum Reproduzieren des Bugs

1. Man setze eine IIS Website (IIS 6 oder 7) auf. Kein Unterordner, kein virtuelles Verzeichnis, wirklich eine eigene Website). Im ASP.NET Development Webserver könnte es sein, dass es funktioniert, hab ich aber nicht probiert.

2. Man baue ein ASP.NET 3.5 Testprojekt auf, welches auf die neu erstellte Website im IIS zeigt.

3. Man nehme ein UrlRewriting Modul, welches den Request auf "/Produkte/123.aspx" bspw. mittels:

HttpContext.Current.RewritePath( "~/Produkte.aspx?Product=123", False )

umbiegt. Wichtig dabei ist, dass man nicht auf demselben Ordner bleibt, sondern einen (nicht vorhandenen) Unterordner (im Beispiel "Produkte") aufruft, da dann die ASP.NET Engine die Pfade umschreiben muss, da sich der interne Pfad vom eigentlich angeforderten unterscheidet.

4. Man baue ein HyperLink Control mit gesetztem ImageUrl Attribut in eine Webform oder ein Control ein.

<asp:HyperLink ID="MyDoofesHyperLinkControl" runat="server" ImageUrl="~/Images/Bild.jpg" NavigateUrl="~/Ordner/Datei.aspx" />

5. Man lasse das ganze laufen.

6. Man "erfreue" sich an der Fehlermeldung.

(Falls ich die Zeit finde, poste ich in den nächsten Tagen noch ein Beispielprojekt, mit dem man das Ganze reproduzieren kann).

Die Lösung ist (wenn man sie kennt) relativ simpel. Man verwendet einfach kein HyperLink Control bzw. dessen ImageUrl Eigenschaft, wenn man mit UrlRewriting arbeitet, sondern trennt hier in ein HyperLink- und ein Imagecontrol.

<asp:HyperLink ID="MyDoofesHyperLinkControl" runat="server" NavigateUrl="~/Ordner/Datei.aspx">
    <asp:Image ID="MyKlugesImageControl" runat="server" ImageUrl="~/Images/Bild.jpg" />
</asp:HyperLink>

Abschliessende Worte

Ehrlich gesagt, find ich es schon ziemlich "komisch", dass ein solcher Bug (und um nichts anderes handelt es sich hier, da gibts keine "by design" oder "feature" Ausrede) nicht zumindest in der neuen Version gefixt wurde. Die Aussage, aus Kompatibilitätsgründen würde das nicht gehen, kann ich nicht nachvollziehen. Alternativ würde eine entsprechend aussagekräftige Fehlermeldung, die das Problem besser beschreibt, auch schon mal helfen, dass man sich keinen Wolf nach möglichen, eigenen Fehlern sucht.

[1] http://pietschsoft.com/post/2007/10/ASPNET-RewritePath-breaks-HyperLinks-ImageUrl-in-App_Theme-file-when-path-with-slash-is-rewritten.aspx
[2] https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=235385

Veröffentlicht Sonntag, 2. November 2008 01:51 von Stefan Falz

Kommentare

# re: ASP.NET 3.5 SP1: Bug im HyperLink Control bei UrlRewriting

Hallo Stefan

Danke für dein Posting, ist ja ganz interessant.

Ich teile deine Meinung, dass dieser Bug auf jeden Fall gefixt werden sollte.

Die Erklärung auf der Connect-Seite ist überhaupt nicht schlüssig, vorallem da es sich hier nicht um eine Änderung des obersten Abstraktionslevel handelt (Auch das ginge ja ohne Probleme mit dem Obsolete-Attibut).

Naja, mal gucken was die da noch machen.

Sonntag, 2. November 2008 12:03 by Peter Bucher

# re: ASP.NET 3.5 SP1: Bug im HyperLink Control bei UrlRewriting

Es gibt natürlich keine Fehlermeldung, auf die ich nicht irgendwann mal treffen werde, auch diese hat mich heute erwischt.

Lokal funktioniert es, online auf dem IIS7 nicht.

Es lag aber bei mir an keinem Hyperlink-Control sondern (so vermute ich) an einer importierten CSS-Datei im Master.

Die Masterdatei liegt direkt im Stammverzeichnis und hat aber eine Page in einem tieferen Verzeichnis. Und das funktioniert halt nicht. Ich weiß es derzeit nicht zu lösen nur zu überbrücken.

Mittwoch, 10. März 2010 22:47 by Luzie
Anonyme Kommentare sind nicht zugelassen