Sök på tekniken.nu

Om tekniken.nu

På tekniken.nu bloggar Iteams konsulter om det som ligger dem varmast om hjärtat - teknik.
www.iteam.se

Prenumerera på tekniken.nu

Bloggportalen.se
Bloggtoppen.se
Top Datorer bloggar
Web Analytics

Clicky

En självklarhet!
Teknikbloggen logotype

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

2010-05-27 12:13 - Utvecklingstips av Christian Landgren
Christian Landgren
Christian Landgren
Systemutvecklare
Iteam

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:

<system.webServer>
    <validationvalidateIntegratedModeConfiguration="false" />
    <modulesrunAllManagedModulesForAllRequests="true">
    </modules>
    <handlers>
      <addname="EURL-ISAPI-2.0_32bit"path="*."verb="GET,HEAD,POST,PUT,DELETE,DEBUG"
           modules="IsapiModule"
           scriptProcessor="%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll"
           preCondition="classicMode,runtimeVersionv2.0,bitness32"responseBufferLimit="0"/>
      <addname="EURL-ISAPI-2.0_64bit"path="*."verb="GET,HEAD,POST,PUT,DELETE,DEBUG"
           modules="IsapiModule"
           scriptProcessor="%SystemRoot%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll"
           preCondition="classicMode,runtimeVersionv2.0,bitness64"responseBufferLimit="0"/>
   </handlers>
</system.webServer>

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

RouteTable.Routes.Add("Table",new Route("xml/{table}",new ApiRouteHandler()));

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

public class ApiRouteHandler :IRouteHandler
{
	#region IRouteHandler Members
	public IHttpHandler GetHttpHandler(RequestContext requestContext)
	{
	   var handler = newApiHttpHandler();
	   return handler;
	}
	#endregion
}

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

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

... och du vet väl att Iteam just nu söker duktiga medarbetare? Läs mer på iteam.se

Andra bloggar om:
Inga kommentarer

Kommentera

Namn

Email

URL

Kommentar

Skriv vad som står i bilden till höger