Hur konfigurera IIS6 för ASP.NET MVC

ASP.NET MVC-ramverket använder sig av den nya routingfunktionaliteten (System.Web.Routing) som kom i och med .NET 3.5 SP1. Den använder route-mappningar för att avgöra vilken Controller som ska ta emot ett visst anrop baserat på hur URL:en ser ut. Routingen definieras i Global.asax code-behindfil. Så här ser standardroutingen ut när du skapat upp ett nytt projekt:

 public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Default",                                              // Route name
        "{controller}/{action}/{id}",                           // URL with parameters
        new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
    );

}

T.ex. så mappas ett anrop mot /Home/About mot ‘HomeController’ och dess metod ‘About’.

/Home/Products mappas mot ‘HomeController’ och dess metod ‘Products’.

/Home/Products/1 mappas mot ‘HomeController’ och dess metod ‘Products’ samt stoppar in id-värdet 1 i anropet.

Om du försöker använda ASP.NET MVC-ramverket med IIS6 eller IIS5 ställer det här till problem eftersom det inte finns någon filändelse i anropet som webbservern kan använda för att förstå att det är aspnet_isapi.dll som ska hantera anropet. Det här går att lösa (på ett ganska fult sätt) genom att peta in en filändelse i själva route-definitionen:

 public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Default",                                              // Route name
        "{controller}.aspx/{action}/{id}",   // URL with parameters
        new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
    );

}

Nu skulle anropen i exemplen ovan alltså se ut så här:

/Home.aspx/About

/Home.aspx/Products

/Home.aspx/Products/1

Du har nu infört en fiktiv filändelse i dina URL:er (eftersom anropet mappas mot en Controller och inte mot någon fysisk fil) och IIS:en processar snällt anropet. Personligen gillar jag inte alls det här sättet att lösa det på, men det kan vara det enda sättet ifall du själv inte har tillgång till administrationen av den IIS:en som du använder (t.ex. i ett hostat scenario).

Om du kan administera din IIS själv är det mycket mer elegant att lägga till en s.k. ‘Wildcard mapping’ för att tillåta IIS att låta aspnet_isapi.dll hantera även anrop som saknar filändelse. Det gör du genom att välja Properties för antingen site eller application och sedan Home –> Configuration –> Insert:

ASP

När du har lagt till denna kan du återigen använda standardroute-mappningar (eller vilken typ av mappningar du vill) utan att behöva ha någon fiktiv filändelse med i URL:en.

Det här gäller även ifall du kör IIS 7 i ‘Classic Mode’ som ju emulerar hur tidigare versioner av IIS hanterade anropen.