我可以编写什么ASP.NET页面生命周期事件来确定发送的视图状态的大小?此外,是否可以在不解析渲染的HTML(如页面对象上的属性)的情况下确定大小,还是解析唯一的方法?
我想要做的是记录尺寸,特别是如果它们超过某个阈值。
答案 0 :(得分:4)
您可以继续编写视图状态的函数 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
答案 1 :(得分:0)
您可以使用SaveStateCompleted,它在所有状态保存到viewstate后立即发生。要知道viewstate的大小,只需在viewstate上调用ToString后进行字符计数。
ViewState.ToString.Count()
答案 2 :(得分:0)
我认为,在查看了Page的Reflector'd机制以及它如何处理viewstate之后,如果你想要实际的viewstate大小,那么你将不得不去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并迭代它的内容。这也很有效,取决于你想要进入多少细节。