Pourquoi ne Session_Start Mondiale.asax.cs provoquer des problèmes de performances?
Lorsque je crée un vide Session_Start gestionnaire Mondiale.asax.cs il provoque une importante frappé lors du rendu des pages dans le navigateur.
Comment reproduire:
Créer un vide ASP.NET MVC 3 application web (je suis en utilisant MVC 3 RC2).
Ensuite, ajoutez un contrôleur de la Maison avec ce code:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult Number(int id)
{
return Content(id.ToString());
}
}
Prochaine créer une vue Home/Index.cshtml et placer celui-ci dans le CORPS de l'article:
@for (int n = 0; n < 20; n++)
{
<iframe src="@Url.Content("~/Home/Number/" + n)" width=100 height=100 />
}
Lorsque vous exécutez cette page, vous verrez 20 IFRAMEs apparaissent sur la page, chacun avec un numéro à l'intérieur. Tout ce que je fais ici est de créer une page qui se charge de plus de 20 pages en coulisses. Avant de continuer, prenez note de la façon dont rapidement ces 20 pages de charge (actualiser la page plusieurs fois pour répéter les charges).
Ensuite, allez à votre Global.asax.cs et ajoutez cette méthode (oui, le corps de la méthode est vide):
protected void Session_Start()
{
}
Maintenant, exécutez à nouveau la page. Cette fois, vous remarquerez que le 20 IFRAMEs charge beaucoup plus lentement, l'un après l'autre d'environ 1 seconde d'intervalle. C'est étrange parce que nous ne sommes pas en train de faire quoi que ce soit dans la fonction Session_Start ... c'est juste une méthode vide. Mais ce qui semble être suffisant pour causer le ralentissement dans les autres pages.
Quelqu'un sait pourquoi ce qui se passe, et, mieux encore, quelqu'un at-il un fix/solution de contournement?
Mise à jour
J'ai découvert que ce problème se produit uniquement lorsque le débogueur est attaché (en cours d'exécution avec la touche F5). Si vous l'exécuter sans le débogueur (Ctrl-F5), puis ça semble être ok. Donc, c'est peut-être pas un problème important, mais c'est toujours étrange.
OriginalL'auteur Mike | 2010-12-15
Vous devez vous connecter pour publier un commentaire.
tl;dr: Si vous rencontrez ce problème avec les Formulaires web et ne nécessitent pas l'accès en écriture à l'état de session dans cette page, en y ajoutant
EnableSessionState="ReadOnly"
à votre@Page
directive contribue.Apparemment, l'existence de
Session_Start
seules forces ASP.NET pour exécuter toutes les demandes émanant de la même Session de manière séquentielle. Ceci, cependant, peut être fixé sur une page par page, si vous n'avez pas besoin d'accès en écriture de la session (voir ci-dessous).J'ai créé ma propre configuration de test avec les Formulaires web, qui utilise une page aspx afin de produire des images.1
Voici la page de test (HTML, la page de démarrage du projet):
Voici la page aspx (GetImage.aspx):
Et les parties pertinentes du code-behind (GetImage.aspx.cs,
using
etnamespace
sauté):Essais
Run 1, non modifiée: La page se charge rapidement, la fenêtre de sortie montre un mélange aléatoire de
Start
etEnd
s, ce qui signifie que les requêtes seront traitées en parallèle.Run 2, ajoutez vide
Session_Start
àglobal.asax
(faut appuyer sur F5 une fois dans le navigateur, je ne sais pas pourquoi il en est):Start
etEnd
suppléant, en montrant que les requêtes seront traitées sequentually. Actualisation du navigateur plusieurs fois montre que cela a des problèmes de performances, même lorsque le débogueur n'est pas attaché.Run 3, comme la course 2, mais ajouter
EnableSessionState="ReadOnly"
à la@Page
directive deGetImage.aspx
: La sortie de débogage affiche plusieursStart
s avant la premièreEnd
. Nous sommes parallèle à nouveau, et nous avons de bonnes performances.1 Oui, je sais que cela doit être fait avec un ashx gestionnaire de la place. C'est juste un exemple.
Je l'ai fait. Run 2 est plus lent que les autres, même sans le débogueur (la différence n'est pas aussi fort qu'avec le débogueur, mais c'est encore perceptible).
OriginalL'auteur Heinzi
Ne peux pas vous dire ce que votre débogueur est en train de faire (intellitrace? la journalisation détaillée? les exceptions de première chance?), mais vous êtes toujours dans les mains des séances de capacité à gérer les demandes simultanées.
Source: ASP.NET vue d'ensemble de l'État de Session, mon accent
Apparemment, un vide
Session_Start
méthode Globale.asax.cs suffit à en faire ASP.NET sérialiser les demandes. J'ai eu un problème similaire avec les Formulaires web et trouvé qu'il peut être corrigé par la mise enEnableSessionState="ReadOnly"
dans le@Page
directive de la page aspx servir le parallèle pages (images dans mon cas). Je ne sais pas si une telle option existe pour MVC.Très intéressant!!! Avez vous de la documentation et des preuves montrant ce comportement? Si oui, merci de créer une nouvelle réponse et je vais le marquer comme acceptée.
Je n'ai pas trouvé de documentation sur ce sujet, mais j'ai ajouté mes conclusions en réponse, l'espoir qu'il sera utile à quelqu'un.
OriginalL'auteur sisve