ASP.NET Forms 页面性能






3.77/5 (3投票s)
提升页面性能。
引言
在大多数 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 应用程序具有可接受的性能,存在几种可能的“瓶颈”需要避免。但是,如果您能找到它,通常可以找到解决问题的方案。