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… :)



Balássy György (MS RD, ASP.NET MVP, MCTS)

Balássy György (MS RD, ASP.NET MVP, MCTS) Villamosmérnök, a BME Automatizálási és Alkalmazott Informatikai Tanszékén webportálok fejlesztését oktatja. 2000 óta foglalkozik a Microsoft .NET platformjával, melynek meghonosításában jelentős szerepet vállalt előadóként, konzulensként és A .NET Framework és programozása című könyv társszerzőjeként. Az MSDN Kompetencia Központon belül a Portál Technológiák Csoport vezetője, szakterülete web alapú rendszerek fejlesztése és üzemeltetése. 2004-ben Magyarországon elsőként kapta meg a Most Valuable Professional címet, majd 2005 óta a Microsoft magyarországi regionális igazgatója. Publikációi a Technet Magazinban, az MSDN Kompetencia Központ honlapján és szakmai blogjában olvashatóak.

2008.10.29. 12:46:50 | Permalink | Hozzászólások: 0 | Tárgyszavak: , ,


  • Mengnyitás böngészőben helyett Fájl letöltése ASP.NET

    Dávid Zoltán Gyakran kell dinamikusan tartalmat (kép, XML) generálni. Mindegy, hogy aspxből, vagy HttpHandlerből. Az ember törli a Response-ot, megadja az új headeröket, betolja a tartalmat a Responseba és kész. Aztán a böngésző megjeleníti a választ. De mit tegyünk, ha a választ nem megjeleníttetni szeretnénk a böngészővel, hanem letölttetni? Tovább »
  • Active Directory lekérdezése T-SQL-ből

    Balássy György (MS RD, ASP.NET MVP, MCTS) Aki valaha is foglalkozott már az Active Directory-val az tudja, hogy a címtár felépítése gyökeresen eltér egy relációs adatbázis szerkezetétől. Nem elég, hogy az egyes elemek konténerekben helyezkednek el, melyek hierarchikus kapcsolatban állnak egymással, de egy konténeren belül teljesen különböző tulajdonságokkal bíró címtár objektumok is lehetnek. És mégis, van lehetőség arra, hogy az SQL Servernek megtanítsuk, hogyan kell lekérdezni a címtárat. Perverzek előnyben :) Tovább »


Írja meg Ön is véleményét!


Hozzászólásokat csak regisztrált, bejelentkezett felhasználóktól tudunk elfogadni!

Hozzászólások