Iteam
GitHub

Hur du skapar Routing till mappar i .NET 4 Classic mode

När man skriver ett REST-API till en applikation vill man gärna stödja en syntax utan filändelser: t ex

http://yourdomain.com/xml/users

Tidigare fanns det massor av trix för IIS6 för att åstadkomma detta, de flesta byggde på 404-ompekning, ISAPI filter, egenskrivna HttpModules eller UrlRewriting. Alla dessa trix förstör dock informationen på vägen, framför allt HttpMethod som alltid blir GET trots att originalmetoden var POST, DELETE eller PUT.

Sedan IIS7 finns det fina lösningar för att hantera detta i web.config om man kör applikationen i s.k Integrated Mode, men kör man Classic Mode fungerar inte denna mappning utan att man pekar om alla anrop till .NET-motorn i IIS. Detta skapar skalbarhetsproblem för bilder och statiska filer som då börjar äta av App poolens resurser istället för att hanteras direkt av IIS.

Från och med .NET 3.5 SP1 finns det stöd för Routing som från början var en del av MVC, men som från och med .NET 4.0 finns tillgängligt för alla typer av ASP.NET- applikationer. Som en del av denna uppdatering kom också stöd för att peka en handler som registreras på path ”*.” (d.v.s. sökvägar) och pekar in dessa till ASP.NET. Detta möjliggör att anrop direkt till mappar skickas in till ASP.NET men övriga anrop (t. ex. bilder, javascript, css o.s.v.) lämnas orörda och hanteras som vanligt av IIS utan inblandning av ASP.NET.

Följande blog beskriver hur du gör:

http://blogs.msdn.com/tmarq/archive/2010/04/01/asp-net-4-0-enables-routing-of-extensionless-urls-without-impacting-static-requests.aspx

Essensen är att lägga till följande block i din web.config:

Samt att skapa en egen route till din handler i Global.asax:
Samt att skapa en egen route till din handler i Global.asax:

Och din egen IRouteHandler som pekar på din IHttphandler:
Och din egen IRouteHandler som pekar på din IHttphandler:

Och installera följande hotfix (kräver omstart):

http://support.microsoft.com/kb/980368

Christian Landgren
2010-05-27