Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 29669|Odpověď: 3

[ASP.NET] ASP.NET více požadavků na stránce současně dochází k blokující situaci pozastavené animace

[Kopírovat odkaz]
Zveřejněno 22.09.2017 17:32:59 | | | |
Nedávno, když jsem pracoval na projektu, některé stránky potřebovaly načíst hodně dat, a někdy jsem klikl na stránku, aniž bych čekal, až se stránka načte, a pak znovu klikl na jinou stránku

Při načítání webové stránky bude velmi pomalý stav pozastavené animace, takže si to dnes pečlivě prostudujeme.

Zpočátku jsem si myslel, že se to stane na mnoha webech nebo na mém problému s rychlostí počítačové sítě, ale zjistil jsem, že tento web tento problém nemá, někdy jsem se při zveřejnění zasekl, ale klikl jsem na jiné stránky v záložce a rychle se načetl.

Pojďme se na to dnes podívat blíže!! Kód byl testován jako první:

Homeview kód:

Kód ovladače:



Pro analýzu testovacího kódu má náš kontrolér 3 metody, jedna je domovská stránka a další dvě jsou testovací metody

Požadavek Test1 blokuje na 5 sekund a poté vrátí data uživateli

Dotazy Test2 neblokují a data budou přímo vracet uživateli

Naše domovská stránka má dvě rozhraní pro požadavky Ajaxu, což jsou asynchronní požadavky, takže není problém s blokováním.

Zjistíme, že metoda Test1 vydává obsah až poté, co Test2 vyprodukuje obsah (Obvykle stránka vypíše obsah vrácený Test2 přímo a poté počká 5 sekund, než vygeneruje obsah vrácený Test1, protože js neblokuje



Poté přímo přistupujeme k rozhraním Test1 a Test2, nejprve k Test1, a pak ihned k Test2, a zjistíme, že Test2 musí počkat, až se Test1 vrátí, aby dokončil, jak je znázorněno na obrázku níže:



Pokud požadavek na stránku nastaví zámek čtečky, ostatní požadavky, které jsou zpracovávány současně ve stejné relaci, nebudou schopny aktualizovat stav relace, ale alespoň je lze číst. Pokud stránka požádá o zápis pro stav relace, jsou všechny ostatní stránky blokovány, bez ohledu na to, zda chtějí obsah číst nebo zapisovat. Například pokud dva pohledy programu píší obsah ve stejné relaci současně, jeden program musí počkat, až druhý program dokončí, než jej může napsat. V programování AJAX je důležité být si toho vědom.

Speciální poznámka: Pouze při zápisu relace Asp.net požadavek zablokuje, ale pokud jste navštívili stránku, kde je relace zapsána, například operace po přihlášení do systému se sezením (relace je samozřejmě uzamčena až do vypršení platnosti, pouze pokud je SessionID stejné). Bude tu tento problém.

Informace o internetových uživatelích

Pokud web používá relaci, každý požadavek ji uzamkne po celou dobu života, takže požadavky se stejným sessionid musí čekat na odemčení

To znamená, že pokud má web stránku s časovým limitem, nemůže nic dělat a musíte čekat, až se časově omezená stránka načte.

Ani to nejde, více současných požadavků Ajaxu na jedné stránce to nejde, dotazy na dotazování zpráv.



Shrnuto:Pokud přijmete sezení k požadavku, pokud nepřinesete sezení k požadavku, výše uvedená situace se nestane

Řešení:

Přidán je funkce SessionState(System.Web.SessionState.SessionState.ReadOnly) do řadiče

Poznámka:

Povinné znamená, že žádáte o exkluzivní zámek na Session (tj. žádné paralelní zpracování požadavků na stejný sessionID)
ReadOnly znamená, že žádáte o neexkluzivní zámek na relaci (tj. váš požadavek musí stále čekat na dokončení požadavků s exkluzivním zámkem, ale můžete zpracovávat požadavky s neexkluzivním zámky paralelně. Nicméně je na vás, abyste zajistili, že váš kód nebude psát do Session. Není to nutně vynucováno rámcem)
Required znamená session mutex, o který jste žádali (tj. není nutné zpracovávat stejné SessionID paralelně)

ReadOnly znamená, že relace, kterou požadujete, je neexkluzivní zámek (tj. váš požadavek musí stále čekat na dokončení, požadavek na exkluzivní zámek, ale můžete zpracovat požadavek s paralelním neexkluzivním zámkem). Ale chcete se ujistit, že váš kód nepíše relace. Nemusí to být prováděno frameworkem)





Předchozí:CEF: Vkládat Chrome pro klienta
Další:HTTP chyba 503. Služba není dostupná.
Zveřejněno 06.07.2018 11:53:31 |
U WebForms přidejte za stránku nahoře v aspx (stačí načíst tu blokující stránku):

EnableSessionState="Pouze pro čtení"
 Pronajímatel| Zveřejněno 14.07.2019 20:34:17 |
Většina webového vývoje používá relace k ukládání stavů relací, ale použití relací v asp.net aplikacích může mít významný dopad na výkon webových aplikací. Proč a co ji ovlivní, je analyzováno níže

Vysvětlení MSDN o současných požadavcích a relaci uvádí:

Současné požadavky a stav relace
Přístup ke stavu ASP.NET relace je na každou relaci, což znamená, že pokud dva různí uživatelé odešlou požadavek současně, přístup ke každé jednotlivé relaci je povolen současně. Pokud jsou však oba současné požadavky pro stejnou relaci (použitím stejné hodnoty SessionID), první požadavek získá exkluzivní přístup k informacím o relaci. Druhý požadavek bude vykonán až po dokončení prvního. (Pokud je exkluzivní zámek na informace o relaci uvolněn, protože první požadavek překročí časový limit zámku, získá přístup i druhá relace.) Pokud nastavíte hodnotu EnableSessionState v direktivě @Page na ReadOnly, požadavky na informace pouze o čtení nevedou k exkluzivnímu zámku dat relace. Nicméně požadavky pouze pro čtení na data relace mohou stále čekat, až bude zámek odemčen z požadavku na čtení/zápis nastaveného datem relace.
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com