【发布时间】:2011-05-02 02:25:13
【问题描述】:
我可以在哪些 ASP.NET 页面生命周期事件中编写代码来确定发出的视图状态的大小?此外,是否可以在不解析呈现的 HTML(如页面对象上的属性)的情况下确定大小,还是解析唯一的方法?
我想做的是记录大小,特别是当它们超过某个阈值时。
【问题讨论】:
-
我最终使用了 javascript 并以这种方式记录它,但 @Aristos 回答了我最初的思路。
我可以在哪些 ASP.NET 页面生命周期事件中编写代码来确定发出的视图状态的大小?此外,是否可以在不解析呈现的 HTML(如页面对象上的属性)的情况下确定大小,还是解析唯一的方法?
我想做的是记录大小,特别是当它们超过某个阈值时。
【问题讨论】:
你可以继续编写视图状态的函数,SavePageStateToPersistenceMedium。这也是用来压缩视图状态的函数...
例如...
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();
....
}
}
一些参考。
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
【讨论】:
您可以使用 SaveStateCompleted,它在所有状态都保存到视图状态之后立即发生。要知道视图状态的大小,只需在视图状态上调用 ToString 后进行字符计数。
ViewState.ToString.Count()
【讨论】:
我认为,在查看了 Page 的 Reflector 机制以及它如何处理视图状态之后,如果你想要实际的视图状态大小,你将不得不去一个 HttpModule 来获得你想要的东西页面。
我这样说是因为您必须在页面呈现后从页面中获取文字字符串,直到所有用户可定义的事件都触发后才会发生。请参阅下面的反射器输出(部分):
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);
否则,您可以获取 viewstatebag 并迭代其内容。这也很有效,具体取决于您想要了解多少细节。
【讨论】: