2010-10-28 12 views
5

¿Qué evento del ciclo de vida de página ASP.NET puedo escribir en código para determinar el tamaño del estado de vista que se envía? Además, ¿es posible determinar el tamaño sin analizar el HTML procesado (como una propiedad en el objeto de la página) o está analizando de la única manera?Determinar el tamaño del estado de visualización de la página ASP.NET antes de publicar la página

Lo que me gustaría hacer es registrar los tamaños, especialmente si cruzan un umbral determinado.

+0

Terminé usando javascript y lo logré de esa manera, pero @Aristos tuvo la respuesta a mi pensamiento original. – slolife

Respuesta

4

Usted puede ir en la función que se va a escribir el estado de vista, la SavePageStateToPersistenceMedium. Esta es la función que también se utiliza para comprimir estado de vista ...

Por ejemplo ...

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

     .... 

    } 
} 

Algunos de referencia.
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

¿Sugiere que anule este método en particular? Eso funcionaria. Pero luego tiene que heredar eso en cada página, ¿verdad? ¿Cómo lo haría sin volver a trabajar en cada página? ~ De acuerdo, agregar algo a cada página como un evento OnSaveCompleted (o lo que sea) requerirá volver a trabajar cada página, así que .../facepalm – jcolebrand

+1

@drachenstern Usted crea la página base, y luego en el código subyacente declara como padre no la página System.Web.UI., sino la página base. Sí, tienes que cambiar eso, en todas las páginas (no tan mal) ... Creo que también hay una manera automática, pero en este momento no estoy 100% seguro de responder si cabe ... – Aristos

+0

~ Sí, nosotros Estoy pensando lo mismo (hago lo mismo con mis páginas maestras ... Tengo un código compartido entre todos) – jcolebrand

0

Puede usar SaveStateCompleted, que ocurre justo después de que todo el estado se haya guardado en viewstate. Para conocer el tamaño de viewstate, simplemente haga un recuento de caracteres después de llamar a ToString en viewstate.

ViewState.ToString.Count() 
+0

pisando en reflector, que se llama antes de que la página se muestre, ¿no? Y dado que aún no se ha escrito, no se puede saber con certeza cuál será el tamaño o me falta algo. de vuelta al reflector! – jcolebrand

0

creo que, después de ver el mecanismo de Reflector'd de página y cómo se maneja estado de vista, que vas a tener que ir a un HttpModule para conseguir lo que eres después, si desea el tamaño real de viewstate en la página.

Lo digo porque tendrá que obtener la cadena literal de la página después de que se haya procesado, lo que no ocurre hasta después de que se hayan desencadenado todos los eventos definidos por el usuario. Ver la salida del reflector a continuación (parcial):

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

De lo contrario, se puede agarrar la viewstatebag y iterar sobre su contenido. Eso también funciona bien, dependiendo de la cantidad de detalles que desee.

Cuestiones relacionadas