IIS 7 migráció: Request is not available in this context

Az elmúlt időszakban több alkalmazást migráltunk Windows Server 2008-ra és IIS 7-re. Volt olyan, amelyik csont nélkül működött az új környezetben is, volt olyan, amelyiknél a web.configot kellett módosítani és bizony volt olyan is, ahol hozzá kellett nyúlnunk a forráskódhoz.

Az egyik alkalmazás, miután áttettük IIS 7-re, az első induláskor sárga halált halt Request is not available in this context üzenettel. A jelenség nem egyedi, sikerült belefutnunk a 26 breaking change egyikébe:

16) It is not possible to access the request through the HttpContext.Current property in Application_Start in global.asax

Lehetséges megoldások:

  1. Az application pool átváltása Classic módba Integrated helyett. Ez persze egy gyors megoldás, de olyan lenne, mintha egy új autó karosszéria alá régi motort tennénk. Na nem olyan nagyon régit, de azért van különbség. Nem tetszett ez a megoldás.
  2. Az alkalmazás módosítása, hogy ne használjuk a Request objektumot az Application_Start eseménykezelőben.

Végül a második megoldás mellett döntöttünk, ezért több helyen kellett módosítanunk a kódot. Az egyik helyen a Request.ApplicationPath értékre volt szükségünk, amit gond nélkül át tudtunk írni HttpRuntime.AppDomainAppVirtualPath hivatkozásra, és ezzel megszűnt a probléma, örültünk.

Egy másik esetben azonban kifejezetten az volt a cél, hogy az alkalmazás indulásakor futtassunk olyan kódot, amelynek a Context objektumra is szüksége volt. Belefirkálunk a logba, ha a a web.configban debug beállítások szerepelnek, de persze csak éles környezet esetén, fejlesztés közben, amikor lokálisan jönnek a kérések, akkor nem:

    if( ( !this.Context.IsCustomErrorEnabled || this.Context.IsDebuggingEnabled ) && !this.Context.Request.IsLocal )
    {
        // Írás a logba...
    }

Itt tehát mindenképp szükségünk volt a HttpContext objektumra, de a kódot nem futtathatjuk az Application_Startban, hanem csak az Application_BeginRequestnél. Végül ez lett a megoldás, az InitializeFirstRequest metódust meghívjuk az Application_BeginRequestből:

    private static object initializationLock = new object();
    private static bool initialized = false;

    private void InitializeFirstRequest()
    {
        if( initialized )
        {
            return;
        }

        lock( initializationLock )
        {
            // Kód futtatása első alkalommal itt...

            initialized = true;
        }
    }

Természetesen elgondolkodtunk azon is, hogy mennyire fontos ez a funkció ahhoz, hogy minden egyes kérés feldolgozását lassítsuk valamennyivel miatta. Azután eszünkbe jutott, hogy hány alkalmazást láttunk már debug módban futni éles környezetben…🙂

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