2011-09-21 7 views
7

Ho un progetto ASP.NET MVC in esecuzione sul mio computer di sviluppo con Windows 7 Ultimate e iOS 7.5.IIS ritarda molto tra ogni risposta con richieste asincrone

faccio la seguente:

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); 
    }}); 
}) 

allora ottengo i seguenti risultati (circa) 12, 521,1025,1550, 2067 async result http://martinhansen.no/hostedimages/async.PNG

Se posso passare l'async su false ottengo: 14,32,49,58,68 sync result http://martinhansen.no/hostedimages/sync.PNG

Sembra che da qualche parte le richieste siano in coda e dopo un po 'risponde solo ogni 500 secondi. Ho fatto in modo che i miei controller restituiscano del testo vuoto invece della chiamata al database, quindi non il database.

Esiste una limitazione su IIS 7.5 per Windows 7? Un'impostazione che posso cambiare? Sospetto una max richiesta simultanea per utente o qualcosa di simile. E poi "ti punisce" rispondendo ogni 500 ms soltanto. In modo che le persone non lo usano come un vero e proprio server.

Probabilmente? E c'è un modo per evitarlo?

risposta

8

Non ha nulla a che fare con IIS in modo apprezzabile o IIS su Windows 7, l'ho provato anche su un server di prova e gli stessi risultati.

E 'stato a causa delle limitazioni imposte dalla sessionstate, vedere le "richieste simultanee e stato sessione" sezione in fondo qui: http://msdn.microsoft.com/en-us/library/ms178581.aspx

Tuttavia, se due richieste simultanee sono fatti per la stessa sessione (utilizzando lo stesso valore SessionID), la prima richiesta ottiene l'accesso esclusivo alle informazioni sulla sessione. La seconda richiesta viene eseguita solo al termine della prima richiesta.

Ma ancora non capisco perché non spari la prossima richiesta subito dopo che il primo è apparentemente finito. Sembra molto falso il ritardo di 500 ms.

Mi sono imbattuto in questa domanda How to set the ASP.NET SessionState read-write LOCK time-out? che parla del tempo di blocco per lo stato della sessione.

System.Web.SessionState.SessionStateModule.LOCKED_ITEM_POLLING_INTERVAL = 500

Questo è il numero magico che ho cercato il mio codice e interwebs per .. 500! Sapevo che doveva essere da qualche parte.

In ogni caso, per risolvere questo problema, ho aggiunto l'attributo sessionstate ai miei controller con la possibilità di sola lettura

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

Per saperne di più su di esso:

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

Continuo a pensare che qualcosa non funzioni, perché la richiesta precedente non dice al sistema che non è più necessario Edita un blocco sullo stato sessione in modo che la richiesta successiva possa essere completata?

0

Quante richieste vengono inviate contemporaneamente? IIS sui sistemi operativi client sono limited to 10 simultaneous connections. Oltre tale limite getta la connessione in entrata in una coda e la elabora quando si apre uno slot.

Questo è stato il caso per molto tempo da parte degli Stati membri per garantire che i sistemi operativi client non siano utilizzati per cannibalizzare le vendite delle loro piattaforme OS server.

Problemi correlati