65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET Forms 页面性能

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.77/5 (3投票s)

2012年7月24日

CPOL

1分钟阅读

viewsIcon

15631

提升页面性能。

引言

在大多数 Web 应用程序中,我们经常会遇到将许多组件放在一起的情况,最终导致性能问题。我们该怎么办?我们通过将大部分功能分散到多个页面来损害可用性。我们总是需要寻找替代方案来解决客户问题,然后我们决定解决它。

历史 

在一个项目中,我遇到了这个问题。一个页面变得非常大,它包含一个由表(递归)填充的树形视图,而且客户端明确要求我将所有项目都展开显示。如果情况是完成的并且没有展开,那么就不会出现性能问题,而且我们也不会发现一种极好的方法来提高页面性能。

要了解页面大小,请右键单击并选择菜单选项“属性”。 

问题解决方案  

要提高页面性能,需要遵循两个步骤:将 VIEWSTATE 存储在会话中并压缩 HTML 页面。

要将 VIEWSTATE 存储在会话中,我们必须重写页面的两个方法。然后您应该添加以下源代码: 

bool _viewStateInSession = true;

public bool ViewStateInSession
{
    get { return _viewStateInSession; }
    set { _viewStateInSession = value; }
}

#region [ Salvar ViewState em Session ]
// ------------------------------------------------ //
// Estes dois Métodos são sobre-escritos para       //
// melhora no desempenho da aplicação. Pois como    //
// tem muitos dados/controles que tem a             //
// necessidade de serem persistidos (gravados em    //
// viewstate).                                      //
// ------------------------------------------------ //

string key_viewState
{
    get
    {
        return "VIEWSTATE" + url_currentPage;
    }
}

/// <summary>
/// Lê o viewstate da Variável de Sessão
/// </summary>
/// <returns></returns>
protected override object LoadPageStateFromPersistenceMedium()
{
    if (_viewStateInSession)
    {
        object objViewState = null;
        objViewState = Context.Session[key_viewState];
        return objViewState;
    }
    else
    {
        return base.LoadPageStateFromPersistenceMedium();
    }
}

/// <summary>
/// Na hora de Salvar o ViewState em variável de Sessão
/// </summary>
/// <param name="state"></param>
protected override void SavePageStateToPersistenceMedium(object state)
{
    if (_viewStateInSession)
        Context.Session[key_viewState] = state;
    else
        base.SavePageStateToPersistenceMedium(state);
}
#endregion

为了压缩 HTML 源代码,我们必须添加以下内容: 

#region [ CompressHtml ]
private bool _compressHtml = true;
public bool CompressHtml
{
    get
    {
        return _compressHtml;
    }
    set
    {
        _compressHtml = value;
    }
}
#endregion

#region [ Render ]
protected override void Render(HtmlTextWriter output)
{
    StringWriter outputWriter = new StringWriter();

    HtmlTextWriter normalOutput = new HtmlTextWriter(outputWriter);
    base.Render(normalOutput);
    normalOutput.Close();

    Session["_RENDER_"] = outputWriter.ToString();

    output.Write(RemoveSpaces(outputWriter.ToString()));
}

private string RemoveSpaces(string origin)
{
    if (!_compressHtml)
        return origin;

    int tam = origin.IndexOf("</head>");

    if (tam != -1)
    {
        tam += 7;
        string header = origin.Substring(0, tam);

        origin = origin.Replace(header, "");

        origin = origin.Replace("//<![CDATA[", " ");
        origin = origin.Replace("//]]>", " ");

        origin = Regex.Replace(origin, "\r\n", " ");
        origin = Regex.Replace(origin, "> <", "><");
        origin = Regex.Replace(origin, "javascript\"><!--", "javascript\">");
        origin = Regex.Replace(origin, "// --></script>\">", "</script>");
        return header + "\r\n" + Regex.Replace(origin, "\\s+", " ");
    }
    return origin;
}

#endregion

这表明创建了一个继承自 Page (System.Web.Page) 类型的类,以便所有页面都继承此系统。因此,无需在所有源代码中添加此代码。 

结论 

为了使 Web 应用程序具有可接受的性能,存在几种可能的“瓶颈”需要避免。但是,如果您能找到它,通常可以找到解决问题的方案。

© . All rights reserved.