Seoriové zpracování POSTu   zodpovězená otázka

C#, ASP.NET MVC

Zdravím,

mám metodu v Controlleru, která mi zpracovává POST request s XML:

[HttpPost]
public void Receiver()
{
   new XmlParser(Request.InputStream).Parse();
}

Chtěl bych zajistit, aby se XMLka zpracovávaly postupně a nejsem si jistý jak přesně to funguje.

Když přijde POST request tak si metoda Receiver() veme vlákno z poolu, správně? No, ale co když příjde další request a metoda Parse() ještě neskončila? Veme se další vlákno, tudíž se začnou XMLka zpracovávat paralelně nebo se čeká až se původní vlákno uvolní?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ve výchozím nastavení by to mělo fungovat tak, že requesty od různých uživatelů (s jiným ASP.NET SessionID) budou obsluhovány paralelně (na CLR Threadpool), ale requesty od stejného uživatele budou "zafrontovány" a zpracovávané postupně.

Toto chování odpovídá nastavení SessionStateBehavior.Default (http://msdn.microsoft.com/en-us/library/... ) v kombinaci s tím, že výchozí MVC handler používá ASP.NET Session.

Nastavení SessionStateBehavior lze pro MVC controller změnit pomoci atributu SessionStateAttribute (http://msdn.microsoft.com/en-us/library/... ) například:

[SessionState(SessionStateBehaviour.Disabled)] 
public class MyController : Controller
{ 

}

Při nastavení SessionStateBehaviour.Disabled nebo SessionStateBehaviour.ReadOnly (označováno jako Session-less Controller) se budou requesty obsluhovat paralelně i pro stejnou session (a session nebude dostupná resp. bude dostupná jen pro čtení).

Pokud ale potřebujete naopak, aby se requesty zpracovávaly postupně i pro různé uživatele, můžete přístup na sdílený objekt (XmlParser) serializovat například pomoci obyčejného locku (což by ale neuvolnilo vlákno) nebo lépe můžete napsat tuto operaci controlleru jako asynchronní (pomoci async/await http://www.asp.net/mvc/tutorials/mvc-4/u... ) a dostupnost sdíleného objektu notifikovat například do awaitované instance TaskCompletionSource (http://msdn.microsoft.com/en-us/library/... ). Ale možná to půjde i jednodušeji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jedna z možných implementací toho AsyncLocku je zde:

http://blogs.msdn.com/b/pfxteam/archive/...

a jiná zde

http://qedcode.com/content/awaitable-cri...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Díky, mrknu na to.

Zkoušel jsem na to poslat cca 300 requestů s xml a vypadá, že se to chová podle předpokladů a zpracovává se to postupně.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback