在提供页面之前确定ASP.NET页面视图状态的大小

时间:2010-10-28 20:13:59

标签: asp.net viewstate

我可以编写什么ASP.NET页面生命周期事件来确定发送的视图状态的大小?此外,是否可以在不解析渲染的HTML(如页面对象上的属性)的情况下确定大小,还是解析唯一的方法?

我想要做的是记录尺寸,特别是如果它们超过某个阈值。

3 个答案:

答案 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并迭代它的内容。这也很有效,取决于你想要进入多少细节。