Определите размер состояния просмотра страницы ASP.NET перед обслуживанием страницы. - PullRequest
5 голосов
/ 29 октября 2010

В каком событии жизненного цикла страницы ASP.NET можно написать код, чтобы определить размер отправляемого состояния представления?Кроме того, возможно ли определить размер без разбора обработанного HTML-кода (например, свойства объекта страницы) или это единственный способ анализа?если они пересекают определенный порог.

Ответы [ 3 ]

4 голосов
/ 29 октября 2010

Вы можете перейти к функции, которая будет записывать состояние представления, SavePageStateToPersistenceMedium .Эта функция также используется для сжатия viewstate ...

Например ...

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

0 голосов
/ 29 октября 2010

Я думаю, что после рассмотрения механизма Reflector'd для Page и того, как он обрабатывает состояние представления, вам нужно перейти к 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);

В противном случае вы можете получить пакет представления состояния и перебрать его содержимое. Это тоже хорошо работает, в зависимости от того, сколько деталей вы хотите рассмотреть.

0 голосов
/ 29 октября 2010

Вы можете использовать SaveStateCompleted, что происходит сразу после того, как все состояние было сохранено в состоянии просмотра.Чтобы узнать размер состояния представления, просто сделайте подсчет символов после вызова ToString для состояния представления.

ViewState.ToString.Count() 
...