2011-09-21 7 views
7

Mam projekt ASP.NET MVC uruchomiony na moim komputerze programisty z systemem Windows 7 ultimate i iis 7.5.IIS dużo opóźnia między każdą odpowiedzią z prośbami asynchronicznymi

I wykonaj następujące czynności:

var requests = ["http://myserver.com/news/details/113834", 
"http://myserver.com/tag/details?ids=113834&entityType=23", 
"http://myserver.com/publish/details?ids=113834&entityType=23", 
"http://myserver.com/generalproperty/details?ids=113834&entityType=23", 
"http://myserver.com/category/details?ids=113834&entityType=23"]; 

var f = new Date().getTime(); 
$.each(requests, function(k,v) { 
    $.ajax({ 
    url :v, 
    async : true, 
    type :'get', 
    success : function(data) { 
     console.log(new Date().getTime() -f); 
    }}); 
}) 

następnie uzyskać następujące wyniki (w przybliżeniu) 12, 521,1025,1550, 2067 async result http://martinhansen.no/hostedimages/async.PNG

Gdybym przełączyć async false uzyskać: 14,32,49,58,68 sync result http://martinhansen.no/hostedimages/sync.PNG

Wydaje się, że żądania są w kolejce, a po chwili odpowiada tylko co 500 sekund na sekundę. Sprawiłem, że moje kontrolery zwracają pusty tekst zamiast wywołania bazy danych, więc nie bazy danych.

Czy istnieje ograniczenie dotyczące IIS 7.5 dla Windows 7? Ustawienie, które mogę zmienić? Podejrzewam, że maksymalna liczba jednoczesnych żądań na użytkownika lub coś podobnego. A potem "karze" cię, odpowiadając co 500 ms tylko. Aby ludzie nie używali go jako rzeczywistego serwera.

Prawdopodobnie? Czy istnieje sposób, aby tego uniknąć?

Odpowiedz

8

Nie ma to nic wspólnego z usługami IIS lub IIS w systemie Windows 7, wypróbowałem go także na serwerze testowym i te same wyniki.

Właśnie z powodu ograniczeń nałożonych przez sessionState, patrz „jednoczesnych żądań i stanu sesji” sekcji na dole tutaj: http://msdn.microsoft.com/en-us/library/ms178581.aspx

Jednak jeśli dwie równoległe żądania są wykonane w tej samej sesji (za pomocą tej samej wartości SessionID), pierwsze żądanie uzyskuje wyłączny dostęp do informacji o sesji. Druga prośba jest wykonywana dopiero po zakończeniu pierwszego żądania.

Ale nadal nie rozumiem, dlaczego nie odpalił następnego wniosku zaraz po tym, jak pierwszy z nich jest pozornie zakończony. Wydaje się bardzo fałszywe opóźnienie 500 ms.

Natknąłem się na to pytanie How to set the ASP.NET SessionState read-write LOCK time-out?, które mówi o czasie blokady dla stanu sesji.

System.Web.SessionState.SessionStateModule.LOCKED_ITEM_POLLING_INTERVAL = 500

To magiczna liczba, która Szukałem mojego kodu i interwebs dla .. 500! Wiedziałem, że musi gdzieś być.

W każdym razie, aby rozwiązać ten problem, dodałem atrybut sessionState do moich kontrolerów z możliwością odczytu tylko

[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)] 
public class BaseController : Controller{} 

Czytaj więcej na ten temat:

http://afana.me/post/session-less-controllers-and-TempData-ASPNET-MVC.aspx

http://weblogs.asp.net/imranbaloch/archive/2010/07/10/concurrent-requests-in-asp-net-mvc.aspx

Nadal uważam, że coś jest nie tak, dlaczego poprzednia prośba nie mówi systemowi, że już nie czy blokuje stan sesji, aby można było ukończyć następne żądanie?

0

Ile żądań wysyłanych jest jednocześnie? Usługi IIS w systemach operacyjnych klienta to limited to 10 simultaneous connections. Powyżej tego limitu wysyła przychodzące połączenie do kolejki i przetwarza je, gdy otwiera się szczelina.

Od długiego czasu MS przykłada dużą wagę do tego, aby systemy operacyjne klientów nie były wykorzystywane do kanalizowania sprzedaży swoich systemów operacyjnych dla serwerów.