Call for Papers ASP-konferenz SDS

die ppedv AG veranstaltet am 22.-23. Juni eine Sharepoint Konferenz mit speziellen Fokus auf Developer. Ort ist Burghausen. (Sharepoint Development Special). Es wird 2 Tracks geben. Track 1 adressiert erfahrene ASP.NET Entwickler  ohne Sharepoint Kenntnisse. Track 2 gilt dem Sharepoint Entwickler auf der Such nach Detaillösungen, vertiefende Inhalte, Tipps und Tricks, Connectivity, Team Entwicklung und ähnliches. Session Vorschläge können per Mail an [asp AT ppedv.de] eingereicht werden. Session Dauer ist 60 Minuten. Weitere Infos demnächst auf www.asp-konferenz.de

404 er- ich hab nichts gemacht

Eine Leser meines Bucht ASP.NET Crash Kurses 2.0 macht mich darauf aufmerksam das die Code Samples nicht mehr zu finden sind. Nun habe ich die Website www.preishuber.net vor Jahren ( 2006) gemacht, getestet und vergessen. Alles ging und ich hab nichts gemacht. Also Remote Desktop auf und in die Konfig vom Server geschaut- Hilfloses rumgeclicke ( 1ter Fehler). Dann Fehler erkannt und in Log geschaut. ( könnte in Windows/systems32/inetsrv/log liegen) Rejected-By-UrlScan ~/asp.net2.0crashkursv2/default.aspx 80 URL Scan ist also der böse, kann mich gar nicht erinnern das mal installiert zu haben. Vermutlich der Windows Update Service (Schuld sind prinzipiell die anderen). Also was ist los. Dazu Logfile des URL Scan Utilitys gecheckt. ( findet sich unter C:\WINDOWS\system32\inetsrv\urlscan\logs) 9-03-05 09:36:00 91.65.128.29 999999999 GET /asp.net2.0CrashKursV2/ Rejected URL+contains+dot+in+path URL - - Ahja. Kann man ja ändern in der Datei Urlscan.ini (eine Ebene höher als die logs) AllowDotInPath=1     Die Frage soll man das ändern? Könnte ja ein Sicherheitsrisiko im IIS darstellen. Auf der anderen Seite gibts sicher Linkverweise und Suchmaschinen indizierungen. Muss jeder selbst entscheiden.

Silverlight Trigger oder nicht Trigger

Ich hab in einem anderen Blog Posting gelesen, wie toll der Einsatz von Triggern unter Silverlight 2 doch ist. Leider sind Trigger in Silverlight 2 eigentlich gar nicht vorhanden. Und das was vorhanden ist, wurde nur aus komptibilitätsgründen zu WPF implementiert. Aber der Reihe nach Was ist ein Trigger? Ein Trigger löst ein Event aus. In WPF werden Trigger als Unterelement eines Controls definiert. In Silverlight gibt es nur einen möglichen Trigger, nämlich loaded. Was kann ich mit einem Trigger tun? In der Regel startet man damit eine Animation. Z.B. wenn man die Maus über einen Button bewegt ändert sich das Design. Leider müssen wir uns in Silverlight mit Loaded begnügen, also kein MouseOver. <TextBox Height="24" Width="113.007" Canvas.Left="8" Canvas.Top="8" Text="TextBox" x:Name="text3" KeyDown="TextBox_KeyDown" TextWrapping="Wrap" Background="yellow" RenderTransformOrigin="0.5,0.5"> <TextBox.Triggers> <EventTrigger RoutedEvent="Canvas.Loaded"> <BeginStoryboard> <Storyboard AutoReverse="True" RepeatBehavior="Forever"> <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="text3" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)"> <SplineDoubleKeyFrame KeyTime="00:00:01.1000000" Value="0.425"/> </DoubleAnimationUsingKeyFrames> <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="text3" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)"> <SplineDoubleKeyFrame KeyTime="00:00:01.1000000" Value="-32.504"/> </DoubleAnimationUsingKeyFrames> </Storyboard> </BeginStoryboard> </EventTrigger> </TextBox.Triggers> <TextBox.RenderTransform> <TransformGroup> <ScaleTransform/> <SkewTransform/> <RotateTransform/> <TranslateTransform/> </TransformGroup> </TextBox.RenderTransform> </TextBox> .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Welche Alternativen gibt es zu Triggern? Man kann natürlich auch das Loaded Event eines jeden Controls nehmen und dort mit einer Zeile Code die Animation starten. Das geht eine wenig am Sinne des Erfinders vorbei. Silverlight soll ja Designer und Coder zusammen führen bzw den Workflow trennen. Wann eine Animation startet ist eigentlich Job des Designers. Microsoft sieht das auch so und hat den Visual State Manager spendiert. Dort wird pro Status oder Statusübergang eine Animation definiert. Anbei ein  Ausschnitt des VSM eines Buttons. <vsm:VisualStateManager.VisualStateGroups> <vsm:VisualStateGroup x:Name="CommonStates"> <vsm:VisualState x:Name="MouseOver"> <Storyboard> <DoubleAnimationUsingKeyFrames Storyboard.TargetName="BackgroundAnimation" Storyboard.TargetProperty="Opacity"> <SplineDoubleKeyFrame KeyTime="0" Value="1"/> </DoubleAnimationUsingKeyFrames> <ColorAnimationUsingKeyFrames Storyboard.TargetName="BackgroundGradient" Storyboard.TargetProperty="(Rectangle.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)"> <SplineColorKeyFrame KeyTime="0" Value="#F2FFFFFF"/> </ColorAnimationUsingKeyFrames> <ColorAnimationUsingKeyFrames Storyboard.TargetName="BackgroundGradient" Storyboard.TargetProperty="(Rectangle.Fill).(GradientBrush.GradientStops)[2].(GradientStop.Color)"> <SplineColorKeyFrame KeyTime="0" Value="#CCFFFFFF"/> </ColorAnimationUsingKeyFrames> <ColorAnimationUsingKeyFrames Storyboard.TargetName="BackgroundGradient" Storyboard.TargetProperty="(Rectangle.Fill).(GradientBrush.GradientStops)[3].(GradientStop.Color)"> <SplineColorKeyFrame KeyTime="0" Value="#7FFFFFFF"/> </ColorAnimationUsingKeyFrames> </Storyboard> </vsm:VisualState> .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Gibts es nun Trigger oder nicht? Weil das vorige Beispiel kein Mensch runtertippt, hat Microsoft dem Produkt Expression Blend eine entsprechende visuelle Unterstützung beigelegt. Kann ich eine Antwort haben? Genau an dieser Stelle war früher der Dialog von Triggern zu finden, die sind nun weg. Also ich behaupte Visual State Manager ersetzt die Trigger in Silverlight 2. Ich bin auch nicht traurig darüber, da Trigger ohnehin kein MouseOver konnten. Zitat aus der Hilfe TriggerAction exists in Silverlight 2 solely for WPF compatibility. TriggerAction is not intended to be derived from as a base for other trigger implementations; the entire Triggers syntax is a discouraged technique in Silverlight 2. Und wie sieht es in der Zukunft aus? Auf der MIX Konferenz wird es die erste Beta von Silverlight 3 geben. Da werden viele schöne Sachen drin sein die echt cool sind ( zb 3 D Support oder property Binding). Trigger laufen da unter weniger wichtig. Sogar im Gegenteil, Microsoft wird WPF den Visual State Manager spendieren, weil der um Ecken einfacher ist. Die Moral? Finger weg von Triggern.

IIS 7 Module Icon

Für meinen Workshop Advanced IIS Development auf der VSone entwickeln wir Erweiterungen für die IIS 7 Admin Oberfläche. Man findet zwar in Büchern und der Doku wie man so einen Module Provider entwickelt, aber nie wie man das Anzeige Symbol ändert.   Vermutlich wird das als allgemein Wissen vorrausgesetzt. Zunächst erstellt man ein Icon im Visual Studio Projekt. Dann wird dieses als eingebette Ressource definiert. Im UIModule wird dann die UIPage instanziert. Dort werden 2 Parameter übergeben: für das ICON im  16x16 und 32x32 Format. In Intellisense wird als Aufruf  Typ (ModulePageInfo) für den Icon Parameter Object angezeigt. Zur Laufzeit wird allerdings Image erwartet. Typ Icon erzeugt einen Laufzeit Fehler. Also muss das Icon in Object Typ Bitmap (Basisklasse Image) geladen werden. Dim icon1 As New Bitmap(Me.GetType, "ppedv.ico") Dim modulePageInfo As New ModulePageInfo(Me, GetType(firstui.Dialog1UiPage), "Hannes Test", "Hannes Test 2", icon1, icon1) .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

Browser Caching verhindern

Diesesmal geht es nicht um performance optimierung mit Caching, sondern wie man dieses explizit verhindert. Gerade mit AJAX oder Silverlight Webservice aufrufen bekommt man alte Ergebnisse präsentiert weil der Browser die Seite schlichtweg nicht noch einmal am Server anfordert. Gesteuert wird dies per HTTP Header. Fiddler lässt sich das ganz gut darstellen. In diesem Fall hat der Browser die Page noch einmal angefragt und vom Server eine 304 ( not modified) Meldung bekommen. Im nächsten Beispiel erzwingt Heise Online das jedesmal der Werbecounter aufgerufen wird und auf keinen Fall der Browser das Ergebnis cachen darf.   Diese Header Information kann man im Code setzen ASP <% Response.CacheControl = "no-cache" %> <% Response.AddHeader "Pragma", "no-cache" %> <% Response.Expires = -1 %> ASP.NET Response.Cache.SetCacheability(HttpCacheability.NoCache) HTML Aus Kompatibilitätsgründen gibt es auch die Möglichkeit per Metatags den Browser anzuweisen wie Caching zu handhaben ist. Ich würde das aber nicht ungeprüft verwenden <HTML><HEAD> <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> <META HTTP-EQUIV="Expires" CONTENT="-1"> </HEAD><BODY> </BODY> </HTML> .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } IIS Webserver Auch der Webserver hat die Möglichkeit Header Information bei jedem Response anzuhängen und so caching zu unterbinden. Dies funktioniert in der MMC des IIS 6 auf Verzeichnisebene. Folgender Dialog zeigt  wie man über hinzufügen den Header ergänzt.       .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

AJAX Scriptmanager berraschung

Beim umstellen einer ASPX Seite auf AJAX bin ich über ein kleines aber feines Detail gestolpert. In der Seite war ein kleines Jscript <script type="jscript"> function pageLoad() { …. } </script> .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Nach einfügen des AJAX Scriptmanagers wurde dieses Script wie von Zauberhand aufgerufen. Das ist mir leider natürlich nicht sofort aufgefallen, so das es etwas überraschende Ergebnisse gab. Nach Recherche folgendes Ergebnis. Wenn per window.onload = myPageLoad; eine Funktion definiert wird, wird diese zuerst aufgerufen. Dann werden alle HTMl Elemente wie eingebette Bilder geladen. Als letztes wird dann noch automatisch pageLoad() aufgerufen. Beschrieben ist das hier.

Silverlight 2 ist da!

Die Spatzen pfeifen es in den einschlägigen Foren von den Dächern. Silverlight 2 ( man achte auf die Versionsnummer) ist fertig und steht auch teilweise schon zum Download bereit. Wie immer werden die Microsoft Server ein wenig zum replizieren brauchen. Wir hier auf der ADC08 haben bereits die erste RTW Anwendung live geschaltet. Damit wird das Session Voting durch die Teilnehmer durchgeführt. Sieht großartig aus! Das wichtigste ist, das B2 (und schon gar nicht vorher) Versionen nicht mit der RTW (release to Web) laufen. Ein möglicher Workaround ist beide Versionen als XAP Paket zu kompilieren. Um den Benutzer dann das jeweils passende Paket zu präsentieren kann man folgende Objekt Tag verschachtelung verwendung.   <object data="data:application/x-silverlight," type="application/x-silverlight-2-b2" width="100%" height="100%"> <param name="source" value="B2App.xap"/> <param name="onerror" value="onSilverlightError" /> <param name="background" value="white" /> <object data="data:application/x-silverlight," type="application/x-silverlight-2" width="100%" height="100%"> <param name="source" value="RTWApp.xap"/> <param name="onerror" value="onSilverlightError" /> <param name="background" value="white" /> <a href=http://go.microsoft.com/fwlink/?LinkID=115261 style="text-decoration: none;"> <img src=http://go.microsoft.com/fwlink/?LinkId=108181 alt="Get Microsoft Silverlight" style="border-style: none"/> </a> </object> </object> .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Viel Spaß mit Silverlight PS: ich halte für ppedv Silverlight Trainings und freue mich über eure Teilnahme

ASP.NET Treeview mit custom images

Auf Kunden Anfrage ( wir geben 12 Monate kostenlosen Support auf unsere Schulungen.) Wie kann man bei einem Treeview Steuerelement Bilder einbauen? Grundsätzlich kann man über die Datei Web.sitemap einen Sitemap erstellen. Durch zusätzliche Attribute kann man so auch Referenzen auf Bilder erzeugen. Dazu benötigt man natürlich noch ein Sitemapdatasource Steuerelement und im Treeview eine Bindung an selbiges. <?xml version="1.0" encoding="utf-8" ?> <siteMap> <siteMapNode title="Home" description="Home" url="~/Default.aspx" > <siteMapNode title="Products" description="Our products" url="~/Products.aspx?name=~/Get_Well/gogogo"> <siteMapNode title="Hardware" description="Hardware choices" url="~/Hardware.aspx" ImageUrl="~/aqua1.jpg" /> <siteMapNode title="Software " description="Software choices" imageurl="~/clock.jpg" /> </siteMapNode> <siteMapNode title="Services" description="Services we offer" url="~/Services.aspx"> <siteMapNode title="Training" description="Training classes" url="~/Training.aspx" /> <siteMapNode title="Consulting" description="Consulting services" url="~/Consulting.aspx" /> <siteMapNode title="Support" description="Supports plans" url="~/Support.aspx" /> </siteMapNode> </siteMapNode> </siteMap> .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Leider wird dies nicht automatisch ausgewertet. Dazu nimmt man einfach das Event das gefeuert wird wenn eine Knoten erzeugt wird und tauscht das Bild aus. Protected Sub TreeView1_TreeNodeDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.TreeNodeEventArgs) Dim nodeFromSiteMap As SiteMapNode = CType(e.Node.DataItem, SiteMapNode) If nodeFromSiteMap("imageUrl") IsNot Nothing Then e.Node.ImageUrl = nodeFromSiteMap("imageUrl") End If End Sub .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Im Browser sieht dann unser Tree so aus. Grundsätzlich lassen sich damit auch viel komplexere Szenarien abbilden um zb Checkboxen oder Buttons im Treeview einzufügen.

Visual Studio 2008 und lokaler IIS 7

Wenn man mit Visual Studio Web Anwendungen schreiben möchte die native Funktionen des IIS7  verwenden soll muss man wohl oder übel auf diesem entwickeln.  Normalerweise erzeugt man ein Web Projekt und verwendet dann den Web Dev (früher Cassini) Webserver. Dieser hat den Vorteil das er mit den Rechten des Benutzers läuft und keinerlei konfiguration bedarf. Wenn Ihr aber ein spezielles IIS7 Module entwicklen wollt braucht ihr den IIS. Beim erzeugen eines ASP.NET Projektes oder einer ASP.NET Website kann man zwischen File System, local IIS, FTP und Remote HTTP auswählen. Wenn die Option lokaler Internet Information Server gewählt wurde kommt evt folgender Dialog. Das bedeutet das eine spezielle Kompatibilität zu IIS 6 fehlt. Genauer gehts um die früher verwendete Metabase zum speichern der IIS Konfiguration und der dazugehörigen API. Dies kann über Windows Programme nachträglich aktiviert werden.

IIS 7 und UR Rewriting

Ein URLRewrite wird verwendet um schönere Hyperlinks zu bekommen. Statt artikel.aspx?íd=1212 wird wunderbarerartikel.aspx. Um dies zu erreichen greift man in den Ablauf innerhalb der IIS Pipeline ein und ersetzt den Pfad mittels RewritePath. Das erfolgt per HTTPModul das in die IIS Pipeline per Web.Config eingeklinkt wird. Erst ab IIS 7 gilt ein per managed Code erstelltes Modul für alle Requests. Vorher waren z.B. GIF vom Rewrite ausgenommen, was enorme Probleme im täglichen Leben erzeugte. Um ein Modul im IIS7 zu registrieren muss man den Bereich System.WebServer verwenden. <system.webServer> <validation/> <modules> <add type="UrlRewrite" name="blogURLrewriteModule"/> </modules> .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Das Modul selbst ist eine Klasse die das iHttpModule Interface implementieren muss. Wenn man mit einer Website arbeitet kann man diese Klasse in app_code Verzeichnis ablegen. Dann muss die Methode Application_BeginRequest implementiert werden. In dieser ruft man dann den rewritepath auf. Private Sub Application_BeginRequest(ByVal source As Object, ByVal e As EventArgs) Dim application As HttpApplication = CType(source, HttpApplication) Dim context As HttpContext = application.Context Dim OldURL As String = application.Request.Url.ToString().ToLower() If (OldURL.IndexOf("suchstring") > -1) Then Dim NewURL As String = "tollerurl.aspx" application.Context.RewritePath(NewURL) .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Theoretisch kann man seit ASP.NET 2.0 auch per web.config ein Rewrite (hier mapping genannt) durchführen. Dies geht aber nur für statische URL’s und lässt keine Variationen des z.B. Querystrings zu. <urlMappings> <add url="von.aspx" mappedUrl="zu.aspx"/> </urlMappings> .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Seit wenigen Tagen hat das IIS7 Team ein rewriter Modul veröffentlicht, das sich per Web.config, auch dynamisch, konfigurieren lässt. Zu finden auf www.iis.net . Ich werde dazu später noch etwas bloggen.