Durva ASP.NET-IIS breaking change a Server SP1-ben

Korábban írtam róla, hogy a .NET 4 GDR Update milyen jó, mert sok egyéb mellett például egy a Windows Server 2008 R2 Service Pack 1 által behozott problémát is megold. Nos, a rossz hír az, hogy nem mindent, ráadásul egy olyan breaking change éled fel tőle, ami nem kevés alkalmazást érinthet.

Van egy szunnyadó változás az ASP.NET környékén, ami egészen addig nem okoz gondot, amíg nem telepítünk egy olyan javítást (QFE), ami aktivizálja ezt a funkciót, például a nemrég megjelent WebMatrix+MVC3+… csomagot vagy éppen a Windows Server/7 SP1-et. A változás a kiterjesztés nélkül URL-ek kezelését érinti, és az a lényeg, hogy mostantól a “/” URL-re érkező kéréseket is az ASP.NET kapja el először és nem az IIS. (Ezt korábban is meg lehetett csinálni a runAllManagedModulesForallRequests beállításával.)

Korábban ez úgy működött, hogy a “/” URL-je jövő kérést az IIS-ben lévő DefaultDocumentModule kapta el és irányította át például a “/default.aspx” címre, átzavarva a kérést a szerver egész HTTP csővezetékén. Ebben a második körben harapott rá a kérésre az ASP.NET, és döntötte el a location és authorization beállítások alapján, hogy kiszolgálja-e a kérést.

Mostantól (.NET 4 + QFE) viszont megfordul a kép: mivel a kérésben nincs kiterjesztés, ezért először az ASP.NET kezdi el feldolgozni azt és ahogy azt elvárjuk, érvényesíti a location és authorization tag-ben lévő beállításokat (átirányít vagy kiszolgálja a kérést).

A rossz hír, hogy a friss .NET 4 GDR Update-nek erre az egészre egy fikarcnyi hatása sincs, ez a változás megmarad utána is. Ez by design viselkedés, ami azért szükséges, hogy az ASP.NET előbb végezze el a dolgát a kiterjesztés nélküli URL-ekre, mint hogy az IIS-ben lévő StaticFile handler lefutna.  A kellemetlenség igazi forrására akkor derül fény, amikor megnézzük az applicationHost.config fájlban, hogy mit is tartalmaz ez a handler:

<add name="StaticFile" path="*" verb="*"
modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" … />

Bizony, egy handlerben van a StaticFileModule és a DefaultDocumentModule is, tehát esély sincs rá, hogy a DefaultDocumentModule előbb dolgozza fel a kérést, mint az ASP.NET egy olyan gépen, ahol a kiterjesztés nélküli URL-ek kezelése be van kapcsolva  Szomorú arc

Ha nincs szükség a kiterjesztés nélküli URL-ekre, akkor az alábbi web.config módosítással orvosolható a probléma:

<system.webServer>
  <handlers>
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  </handlers>

  <!-- Ha az IIS még panaszkodik "disallowed configuration sections" miatt,
       akkor még ez is kellhet: -->
  <!--
    <validation validateIntegratedModeConfiguration="false" />
  -->
</system.webServer>

 

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s