Monthly Archives: August 2010

Blokkolás aszinkron postback idejére

Beismerem, már a cím is elég visszás, hiszen az aszinkron postback, az Ajax egyik eredeti célja az volt, hogy a felhasználó kényelme érdekében a postback művelet a háttérben történjen, és ne blokkolja a felhasználói felületet. Ennek ellenére sajnos időnként mégis szükség van arra, hogy az Ajaxos hívás idejére letiltsunk bizonyos vezérlőket, vagy legalábbis a képernyő egyes részeit.

Ehhez nagyon hasznos segítség lehet a jQuery, amit biztosan nem kell bemutatni. Legjobban azt szeretem benne, hogy végtelen mennyiségű plugin érhető el hozzá, (bár egyben ez a hátránya is, gyakran a megfelelő plugin kiválasztása tovább tart, mint utána a beépítése az alkalmazásba), melyek közül a fenti feladatra nekem legjobban a jQuery BlockUI plugin vált be. A letölthető JavaScript fájl mindössze 16KB, de ha vesszük magunknak a fáradtságot és minimalizáljuk, akkor mindössze 7.59 KB-ot foglal, amit még a webszerver tovább tömöríthet, így a kliensnek máris csak 3.6KB-ot kell letölteni.

Ezt a plugint felhasználva a teljes ablakunk (amit itt a példában egy id=”main” attribútummal ellátott div valósít meg) blokkolása egy üzenettel, mellette egy forgó képpel, félig átlátszó szürke átfedéssel (overlay) és egy fehér, keretezett ablakkal középen mindössze ennyi:

  $("#main").block({
    message: ' <img src="progress.gif" /> Feldolgozás folyamatban...',
    css: { border: '1px solid black', width: '200px', padding: '20px', 
color: 'black', 'background-color': 'white' }, overlayCSS: { backgroundColor: '#f2f5f8', opacity: 0.9 } });

A blokkoló üzenet eltűntetése még egyszerűbb:

  $("#main").unblock();

Már csak arra van szükségünk, hogy ezeket a kódokat aszinkron postback esetén hívjuk meg. Szerencsére az ASP.NET Ajax Library PageRequestManager kliens oldali “osztálya” biztosít beginRequest és endRequest eseményeket, melyekre feliratkozhatunk:

  Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(function (sender, args) {
    // Blokkolás itt
  });

  Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function (sender, args) {
    // Blokkolás feloldása itt
  }); 

Ennyi az egész, a kód mehet rögtön a master page tetejére a ScriptManager után, és máris minden oldalon meg fogjuk kapni a Feldolgozás folyamatban… üzenetet aszinkron művelet esetén.

Technorati-címkék: ,,,

Event ID 36 – Class not registered

Tesztelési célokból szükségem lett egy Windows XP-re és rajta IIS 5.1-re. Annak rendje és módja szerint el is indítottam az Add/Remove Windows Components varázslót, hogy telepítsem a webszervert, de sajnos a varázsló hol belefagyott a telepítésbe, hol pedig végigcsinálta, csak éppen a böngészőben 500-as HTTP hibát kaptam, mikor a http://localhost oldalt akartam megnézni. A legszebb az egészben az volt, hogy a http://localhost/mmc.gif bejött, de a http://localhost/localstart.asp nem.

Az Eseménynaplóban ez fogadott:

Event Type: Warning
Event Source: W3SVC
Event Category: None
Event ID: 36
Description:
The server failed to load application ‘/LM/W3SVC/1/ROOT. The error was ‘Class not registered’.

Ilyen hibákat az ember akkor szokott kapni, ha a COM világában siklott valami félre, így aztán megpróbáltam megnyitni a Component Services MMC-t, de az is belefagyott a My Computer ág megnyitásába vagy ha szerencsém volt, ezt a hibát dobta:

Catalog error – An error occurred while processing the last operation: 80040154, Class not registered.

Jobban megnézve az MSDTC nem is futott, és amikor megpróbáltam elindítani, ez fogadott:

Event Type: Error
Event Source: Service Control Manager
Event Category: None
Event ID: 7024
Description: The Distributed Transaction Coordinator service terminated with service-specific error 3221229584 (0xC0001010).

Ez volt az a pont, amikor elkezdtem azt érezni, hogy a sok órányi Microsoft Update frissítés csak rontott ez életemen, egy szűz XP-n valószínűleg ment volna minden simán 😦

Végül a következő lépésekkel sikerült megoldani a problémát:

1. A KB916926 szerint újra létrehoztam az MSDTC logfájlját így:

msdtc -resetlog

2. A KB301919 szerint letöröltem a HKEY_LOCAL_MACHINESOFTWAREMicrosoftCOM3 kulcsot, majd végigkattintgattam az Add/Remove Windows Components varázslót az alapbeállításokkal, hogy létrehozza újra. Ez szerencsére nem fagyott le 🙂

3. Bernard cikkét követve regisztráltam az IIS komponenseit:

cd %windir%system32inetsrv
rundll32 wamreg.dll, CreateIISPackage
regsvr32 asptxn.dll
iisreset

A neten olvasgatva kiderült, hogy sajnos a hiba akár IIS 7-en is ugyanígy elő tud fordulni és a megoldás ott is ugyanez.

Technorati-címkék: ,