2010-10-28 4 views
5

Quel événement de cycle de vie de page ASP.NET puis-je écrire du code pour déterminer la taille de l'état d'affichage envoyé? Aussi, est-il possible de déterminer la taille sans analyser le HTML rendu (comme une propriété sur l'objet page) ou est l'analyse de la seule manière?Déterminer la taille de viewstate de la page ASP.NET avant de dessiner la page

Ce que je voudrais faire est de consigner les tailles, en particulier si elles franchissent un certain seuil.

+0

J'ai fini par utiliser le javascript et je l'ai enregistré de cette façon, mais @Aristos a eu la réponse à ma pensée originale. – slolife

Répondre

4

Vous pouvez aller sur la fonction qui va écrire le viewstate, le SavePageStateToPersistenceMedium. Ceci est la fonction qui a également utilisé pour compresser ... viewstate

Par exemple ...

public abstract class BasePage : System.Web.UI.Page 
{ 
    private ObjectStateFormatter _formatter = new ObjectStateFormatter(); 

    protected override void SavePageStateToPersistenceMedium(object viewState) 
    { 
     MemoryStream ms = new MemoryStream();  
     _formatter.Serialize(ms, viewState);  
     byte[] viewStateArray = ms.ToArray(); 

     .... 

    } 
} 

Certains référence.
http://www.codeproject.com/KB/viewstate/ViewStateCompression.aspx
http://forums.asp.net/p/1139883/3836512.aspx
http://www.dotnetcurry.com/ShowArticle.aspx?ID=67&AspxAutoDetectCookieSupport=1

+0

Suggérez-vous qu'il passe outre cette méthode en particulier? Ça marcherait. Mais ensuite, il doit hériter ça à chaque page, n'est-ce pas? Comment le ferait-il sans retravailler chaque page? ~ Certes, ajouter quelque chose à chaque page en tant qu'événement OnSaveCompleted (ou autre) va nécessiter de retravailler chaque page aussi, alors .../facepalm – jcolebrand

+1

@drachenstern Vous créez la BasePage, puis sur le codebehind vous déclarez comme parent pas le System.Web.UI.Page, mais la BasePage. Oui vous avez besoin de changer cela, sur toutes les pages (pas si mal) ... Je pense qu'il y a aussi un moyen automatique mais en ce moment je ne suis pas sûr à 100% de répondre si ... – Aristos

+0

~ Oui, nous Je pense la même chose (je fais de même avec mes MasterPages ... J'ai du code qui est partagé entre tous) – jcolebrand

0

Vous pouvez utiliser SaveStateCompleted, qui se produit juste après que tout l'état a été enregistré dans le viewstate. Pour connaître la taille de viewstate, il suffit de faire un nombre de caractères après avoir appelé ToString sur viewstate.

ViewState.ToString.Count() 
+0

le traversant dans un réflecteur, qui est appelé avant que la page ne soit rendue, non? Et comme il n'a pas encore été écrit, vous ne pouvez pas savoir avec certitude quelle sera la taille, ou est-ce qu'il me manque quelque chose? retour au réflecteur! – jcolebrand

0

Je pense que, après avoir examiné le mécanisme Reflector'd pour la page et comment il gère viewstate, que vous allez devoir aller à un HttpModule pour obtenir ce que vous êtes après, si vous voulez la taille réelle viewstate sur la page. Je dis cela parce que vous allez devoir récupérer la chaîne littérale de la page après qu'elle a été rendue, ce qui n'arrive qu'après que tous les événements définissables par l'utilisateur se soient déclenchés. Voir la sortie réflecteur ci-dessous (partielle):

  this.PerformPreRenderComplete(); 
      if (context.TraceIsEnabled) 
      { 
       this.Trace.Write("aspx.page", "End PreRenderComplete"); 
      } 
      if (context.TraceIsEnabled) 
      { 
       this.BuildPageProfileTree(this.EnableViewState); 
       this.Trace.Write("aspx.page", "Begin SaveState"); 
      } 
      if (EtwTrace.IsTraceEnabled(5, 4)) 
      { 
       EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_SAVE_VIEWSTATE_ENTER, this._context.WorkerRequest); 
      } 
      this.SaveAllState(); 
      if (EtwTrace.IsTraceEnabled(5, 4)) 
      { 
       EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_SAVE_VIEWSTATE_LEAVE, this._context.WorkerRequest); 
      } 
      if (context.TraceIsEnabled) 
      { 
       this.Trace.Write("aspx.page", "End SaveState"); 
       this.Trace.Write("aspx.page", "Begin SaveStateComplete"); 
      } 
      this.OnSaveStateComplete(EventArgs.Empty); 
      if (context.TraceIsEnabled) 
      { 
       this.Trace.Write("aspx.page", "End SaveStateComplete"); 
       this.Trace.Write("aspx.page", "Begin Render"); 
      } 
      if (EtwTrace.IsTraceEnabled(5, 4)) 
      { 
       EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_RENDER_ENTER, this._context.WorkerRequest); 
      } 
      if (str != null) 
      { 
       this.ExportWebPart(str); 
      } 
      else 
      { 
       this.RenderControl(this.CreateHtmlTextWriter(this.Response.Output)); 
      } 
      if (EtwTrace.IsTraceEnabled(5, 4)) 
      { 
       EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_RENDER_LEAVE, this._context.WorkerRequest); 
      } 
      if (context.TraceIsEnabled) 
      { 
       this.Trace.Write("aspx.page", "End Render"); 
      } 
      this.CheckRemainingAsyncTasks(false); 

Sinon, vous pouvez saisir le viewstatebag et itérer sur son contenu. Cela fonctionne bien aussi, selon le niveau de détail que vous voulez.

Questions connexes