[探讨]高速,优良的ASPX网站开发架构思路之一...附VS2008工程代码..

AKULAKK 2008-08-22 04:50:56
今天是试用VS2008的第二天,谈不上喜欢不喜欢,对于我来说语言都是工具,只是VS2008这个工具可以方便的开发Javascript应用程序,这个我比较喜欢,其他的,我觉得还不如VS2003呢...不过呢,一山不能存二虎,我可不喜欢乱七八糟的装很多软件,所以我决定慢慢的用VS2008来代替VS2003,这样以后重装系统的时候就不用装VS2003了,就一个VS2008,瞧,多干净啊...
好了好了,说正事.说到VS,不得不说其缔造者--微软,为什么要创造ASP.NET呢?哦 是为了和IBM等同行竞争,在windows平台上竞争,呵呵.那么windows是西方国家的产物,在工业化观念很强的西方国家,基于模块化组件化的设计是非常被推崇的,所以基于.NET的组件式模块化windows开发被微软认为是主流.好的,注意,这里并没有提到效率和速度,从西方工业化的观点来说,模块化组件式的概念高于效率这个概念,这句话等同于牺牲效率换来快速的组件开发方式.说到这里,你应该明白为什么微软体系架构的速度拼不赢LAMP体系了吧?因为一个注重开发效率,另一个注重运行效率.SO...选择什么,你心里应该有个底儿了吧.
那么,我今天想说的是,怎么样才能在基于优良组件化设计的思路下,尽可能高的提高性能呢?为了直观的批判基于VIEWSTATE的官方ASPNET2.0技术,我们来看看下面的非官方ASPX的开发思路,这个思路既可以使用.NET的面向对象设计模式也可以媲美PHP的高效执行模式.我想你们可能已经习惯了ASPX拖来拖去的控件开发方式了,也已经习惯了慢吞吞的网页打开速度了,不过没关系,看了以下文章,相信你必定会有所启发.

我会提到昨天我说到的3种开发方式:
1.后端文件开发方式,codebehind
2.混合页面开发方式,PHP方式
3.官方组件开发方式.

先说第一种,为了不使用VIEWSTATE,建立一个main.aspx,然后删除ASPX页面里面的HTML代码,只留下以下代码

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="main.aspx.cs" Inherits="main" %>
<%=HTML%>

后端代码
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
public partial class main : basepage
{
protected string HTML = "";
protected void Page_Load(object sender, EventArgs e)
{
HTML = "<div style='font-size:17px;font-family:Times New Roman;width:500px;color:#ffffff;'>While Wrath of the Lich King will improve many of World of Warcraft's existing features, it will also introduce plenty of brand-new ones to keep the game fresh and interesting. One of these new features is sure to suit a wide range of play styles: achievements. These self-contained goals will offer new challenges, satisfy goal-oriented players, allow others to see your accomplishments in World of Warcraft -- and are just plain fun</div>";
}

}

注意后端代码里面的 basepage 基类.这里我说一下,我们创建一个新的aspx页面的时候,默认是继承自System.Web.UI.Page,但是往往我们做的很多页面都有公共的banner和footer,在不使用微软官方技术的前提下,我们需要自己建立我们的基类,然后每个页面继承自这个基类,实现面向对象的继承优势.下面来看basepage.cs

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
/// <summary>
///basepage 的摘要说明
/// </summary>
public class basepage : System.Web.UI.Page
{
public basepage()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
protected override void OnError(EventArgs e)
{
base.OnError(e);
}
protected override void Render(HtmlTextWriter writer)
{
writer.Write(ui.BASEPAGE_START);//加入banner
base.Render(writer);//相当于每个派生页面
writer.Write(ui.BASEPAGE_END);//加入footer

}
}

其实就是重载了Render,这样我们就可以仅仅把每个新建的aspx里的System.Web.UI.Page替换为basepage,就简单的实现了ASP2.0里面的MASTER Page的功能.
...全文
321 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
兮帅 2010-04-12
  • 打赏
  • 举报
回复
站点文件夹下的目录怎么设置?
iislove 2008-09-01
  • 打赏
  • 举报
回复
挺长的~只看了一楼
weir55 2008-09-01
  • 打赏
  • 举报
回复
路過,空了來看看
weinaxxc 2008-08-22
  • 打赏
  • 举报
回复
mark一下!有空看!
cteddy 2008-08-22
  • 打赏
  • 举报
回复
他就是想生成静态的
没有意思这样做
kkun_3yue3 2008-08-22
  • 打赏
  • 举报
回复
最快的是静态页面
AKULAKK 2008-08-22
  • 打赏
  • 举报
回复
根据实战经验,模板和多语言技术是个重头戏.如果用PHP,势必一堆require或者include,LINUX的文件操作很快的,wnidows比不赢,那么我们该怎么办呢?答案是用Application或者static变量,但是我不喜欢Application,因为那个我都觉得效率不够高,我用static变量,就像上面basepage.cs里面用到的的ui类:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
/// <summary>
///ui 的摘要说明
/// </summary>
public class ui
{
public static string BASEPAGE_START = "";
public static string BASEPAGE_END = "";
public ui()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
}

看到没?很简单吧.类的属性又比直接存取一个public变量要慢了,所以改用全局变量,而非属性操作,呵呵,这里我们追求极端速度嘛...,那么看了以上代码,问题又来了,没有赋值??抑或在什么地方赋值的呢?哦 这里就要追朔到我们的global.asax,asp2.0默认是没有的,需要从项目列表里新建一个,来看global.asax代码

<%@ Application Language="C#" %>
<script runat="server">

private static string getHTML(string tagName)
{
string tagNameStart = tagName + ".st";
string tagNameEnd = tagName + ".ed";
int cpStart = tmp.IndexOf(tagNameStart, 0);
int cpEnd = tmp.IndexOf(tagNameEnd, 0);
return tmp.Substring(cpStart + tagNameStart.Length,cpEnd - cpStart - tagNameStart.Length );
}

private static string tmp = "";

public static string strSystemStatus = "NORMAL";
void Application_Start(object sender, EventArgs e)
{
//在应用程序启动时运行的代码
//加载模板txt文件到内存,在内存中进行高速处理
reloadTemplate(Server.MapPath("template\\default.txt"));
}
public static void reloadTemplate(string strFileName)
{
System.IO.StreamReader sr = null;
try
{
sr = new System.IO.StreamReader(strFileName, System.Text.Encoding.Default);
tmp = sr.ReadToEnd();
sr.Close();

ui.BASEPAGE_START = getHTML("main.aspx.header");
ui.BASEPAGE_END = getHTML("main.aspx.footer");
}
catch (Exception ex)
{
strSystemStatus = "ERROR:" + ex.ToString();
}
finally
{
if (sr != null)
sr.Close();
}
tmp = "";//回收tmp堆占用空间
}

void Application_End(object sender, EventArgs e)
{
//在应用程序关闭时运行的代码
}

void Application_Error(object sender, EventArgs e)
{
//在出现未处理的错误时运行的代码
}
void Session_Start(object sender, EventArgs e)
{
//在新会话启动时运行的代码
}
void Session_End(object sender, EventArgs e)
{
//在会话结束时运行的代码。
// 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
// InProc 时,才会引发 Session_End 事件。如果会话模式
//设置为 StateServer 或 SQLServer,则不会引发该事件。
}
protected void Application_EndRequest(object sender, EventArgs e)
{
System.DateTime startTime = (System.DateTime)Application["StartTime"];
System.DateTime endTime = System.DateTime.Now;
System.TimeSpan ts = endTime - startTime;
Response.Write("<hr size=\"1\">页面执行时间:" + ts.Milliseconds + " 毫秒" +" <font color=red> YASHIKA NETWORK</font><br>内存用量:" + GC.GetTotalMemory(false).ToString("###,###") + "Byte.");
Response.Write(" 系统状态: " + strSystemStatus);
}
protected void Application_BeginRequest(object sender, EventArgs e)
{
Application["StartTime"] = System.DateTime.Now;
}
</script>

这个global.asax代码是关键.这段代码用到的模板在default.txt里面,系统启动的时候只加载一次到内存.之后不用再进行IO操作,如果您更改了模板,可以使用reload.aspx重新加载模板到内存,reload.aspx.cs代码如下

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
public partial class reload : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
ASP.global_asax.reloadTemplate(Server.MapPath("template\\default.txt"));
}
}

好,代码DEMO完毕,我来说下global.asax的设计思路了.
一个一个方法来
1.getHTML,用于从已经一次性加载到内存里的tmp字符串里面提取需要的HTML代码(这里可以扩充方法,完成很多HTML的提取方式,类包装,分类,分语言,分皮肤等等等等....)参数就是HTML代码段的名字,对应default.txt里面的模板名.
2.strSystemStatus,这个是系统健康状态指示器,用于启动和运行时对系统的状态进行检测,输出错误LOG,调试信息,自行扩充了...
3.reloadTemplate(),这个方法用于加载default.txt里的模板代码到内存.并且实现分类.
这样,main.aspx页面打开的时候,就不会包含viewstate代码,而且开发方式就和PHP差不多了.


整个程序的优势在于模板操作都在内存里面,而且没有冗余对象代码.峰值内存占用极小(这里我之所以说峰值,是因为基于官方的控件树开发方式是非常非常消耗内存的,相当吃内存,因为.NET的GC定时在回收垃圾内存,所以这个值在不断的波动,那么当微软市场部在给人演示参数的时候,都是取的波动值谷底的数据给大家看,这个时候往往大家都觉得---哦,和PHP那些占用的内存差不多嘛.那你就错了..NET的内存很难控制好的)而且编程方式灵活多变,类似ASP和PHP这么灵活了(比如在main.aspx里面代码混写),还有global.asax定时器可以实现,轻松使用VS开发工具实现各种设计模式,而且和.NET版本无关,将来再出什么.NET FRAMEWORKXXX的时候都是直接升级不会有影响,速度嘛,最快的了,.NET平台上没有比这个更快的方式了,是不是很爽?当然,如果你是一个"懒"程序员,喜欢微软的拖来拖去的,也可以用这个工程直接添加新页面,只不过不要继承自basepage就可以了嘛```嘎嘎,很灵活是吧.

好了工程代码提供下载,供研究...呵呵 其实我建立一个新的工程,也是基于这个工程文件来做的.


http://x8.6930.com/download.aspx


哦 对了 还有点我想说下

如果您的网站首页是index.aspx,第一次打开的那个用户会很慢进而很迷茫,对吧.

可以这样,做个index.html默认为首页,然后

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>正在导向...</title>
</head>
<body>
正在导向...请稍候...
<script>
location.replace("main.aspx");
</script>
</body>
</html>

这样,如果页面正在被服务器生成,那么客户会看到"正在导向...请稍候"的提示,很友好.
但是对搜索引擎就显得不那么友好了...针对这个又有很多SEO的办法......唔,这里我就不说了,大家揣摩揣摩吧
AKULAKK 2008-08-22
  • 打赏
  • 举报
回复
根据实战经验,模板和多语言技术是个重头戏.如果用PHP,势必一堆require或者include,LINUX的文件操作很快的,wnidows比不赢,那么我们该怎么办呢?答案是用Application或者static变量,但是我不喜欢Application,因为那个我都觉得效率不够高,我用static变量,就像上面basepage.cs里面用到的的ui类:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
/// <summary>
///ui 的摘要说明
/// </summary>
public class ui
{
public static string BASEPAGE_START = "";
public static string BASEPAGE_END = "";
public ui()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
}

看到没?很简单吧.类的属性又比直接存取一个public变量要慢了,所以改用全局变量,而非属性操作,呵呵,这里我们追求极端速度嘛...,那么看了以上代码,问题又来了,没有赋值??抑或在什么地方赋值的呢?哦 这里就要追朔到我们的global.asax,asp2.0默认是没有的,需要从项目列表里新建一个,来看global.asax代码

<%@ Application Language="C#" %>
<script runat="server">

private static string getHTML(string tagName)
{
string tagNameStart = tagName + ".st";
string tagNameEnd = tagName + ".ed";
int cpStart = tmp.IndexOf(tagNameStart, 0);
int cpEnd = tmp.IndexOf(tagNameEnd, 0);
return tmp.Substring(cpStart + tagNameStart.Length,cpEnd - cpStart - tagNameStart.Length );
}

private static string tmp = "";

public static string strSystemStatus = "NORMAL";
void Application_Start(object sender, EventArgs e)
{
//在应用程序启动时运行的代码
//加载模板txt文件到内存,在内存中进行高速处理
reloadTemplate(Server.MapPath("template\\default.txt"));
}
public static void reloadTemplate(string strFileName)
{
System.IO.StreamReader sr = null;
try
{
sr = new System.IO.StreamReader(strFileName, System.Text.Encoding.Default);
tmp = sr.ReadToEnd();
sr.Close();

ui.BASEPAGE_START = getHTML("main.aspx.header");
ui.BASEPAGE_END = getHTML("main.aspx.footer");
}
catch (Exception ex)
{
strSystemStatus = "ERROR:" + ex.ToString();
}
finally
{
if (sr != null)
sr.Close();
}
tmp = "";//回收tmp堆占用空间
}

void Application_End(object sender, EventArgs e)
{
//在应用程序关闭时运行的代码
}

void Application_Error(object sender, EventArgs e)
{
//在出现未处理的错误时运行的代码
}
void Session_Start(object sender, EventArgs e)
{
//在新会话启动时运行的代码
}
void Session_End(object sender, EventArgs e)
{
//在会话结束时运行的代码。
// 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
// InProc 时,才会引发 Session_End 事件。如果会话模式
//设置为 StateServer 或 SQLServer,则不会引发该事件。
}
protected void Application_EndRequest(object sender, EventArgs e)
{
System.DateTime startTime = (System.DateTime)Application["StartTime"];
System.DateTime endTime = System.DateTime.Now;
System.TimeSpan ts = endTime - startTime;
Response.Write("<hr size=\"1\">页面执行时间:" + ts.Milliseconds + " 毫秒" +" <font color=red> YASHIKA NETWORK</font><br>内存用量:" + GC.GetTotalMemory(false).ToString("###,###") + "Byte.");
Response.Write(" 系统状态: " + strSystemStatus);
}
protected void Application_BeginRequest(object sender, EventArgs e)
{
Application["StartTime"] = System.DateTime.Now;
}
</script>

这个global.asax代码是关键.这段代码用到的模板在default.txt里面,系统启动的时候只加载一次到内存.之后不用再进行IO操作,如果您更改了模板,可以使用reload.aspx重新加载模板到内存,reload.aspx.cs代码如下

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
public partial class reload : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
ASP.global_asax.reloadTemplate(Server.MapPath("template\\default.txt"));
}
}

好,代码DEMO完毕,我来说下global.asax的设计思路了.
一个一个方法来
1.getHTML,用于从已经一次性加载到内存里的tmp字符串里面提取需要的HTML代码(这里可以扩充方法,完成很多HTML的提取方式,类包装,分类,分语言,分皮肤等等等等....)参数就是HTML代码段的名字,对应default.txt里面的模板名.
2.strSystemStatus,这个是系统健康状态指示器,用于启动和运行时对系统的状态进行检测,输出错误LOG,调试信息,自行扩充了...
3.reloadTemplate(),这个方法用于加载default.txt里的模板代码到内存.并且实现分类.
这样,main.aspx页面打开的时候,就不会包含viewstate代码,而且开发方式就和PHP差不多了.


整个程序的优势在于模板操作都在内存里面,而且没有冗余对象代码.峰值内存占用极小(这里我之所以说峰值,是因为基于官方的控件树开发方式是非常非常消耗内存的,相当吃内存,因为.NET的GC定时在回收垃圾内存,所以这个值在不断的波动,那么当微软市场部在给人演示参数的时候,都是取的波动值谷底的数据给大家看,这个时候往往大家都觉得---哦,和PHP那些占用的内存差不多嘛.那你就错了..NET的内存很难控制好的)而且编程方式灵活多变,类似ASP和PHP这么灵活了(比如在main.aspx里面代码混写),还有global.asax定时器可以实现,轻松使用VS开发工具实现各种设计模式,而且和.NET版本无关,将来再出什么.NET FRAMEWORKXXX的时候都是直接升级不会有影响,速度嘛,最快的了,.NET平台上没有比这个更快的方式了,是不是很爽?当然,如果你是一个"懒"程序员,喜欢微软的拖来拖去的,也可以用这个工程直接添加新页面,只不过不要继承自basepage就可以了嘛```嘎嘎,很灵活是吧.

好了工程代码提供下载,供研究...呵呵 其实我建立一个新的工程,也是基于这个工程文件来做的.
http://x8.6930.com/download.aspx


哦 对了 还有点我想说下

如果您的网站首页是index.aspx,第一次打开的那个用户会很慢进而很迷茫,对吧.

可以这样,做个index.html默认为首页,然后

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>正在导向...</title>
</head>
<body>
正在导向...请稍候...
<script>
location.replace("main.aspx");
</script>
</body>
</html>

这样,如果页面正在被服务器生成,那么客户会看到"正在导向...请稍候"的提示,很友好.
但是对搜索引擎就显得不那么友好了...针对这个又有很多SEO的办法......唔,这里我就不说了,大家揣摩揣摩吧
国际学术期刊Science/AAAS和英特尔在全球首次联袂推出第一季《架构师成长计划》以来,吸引了无数架构师踊跃参与,获得业内广泛赞誉。为持续助力架构师把握数智机遇,构建未来,第二季《架构师成长计划》全新升级,强势归来!业内顶尖架构师大咖齐聚,为架构师群体量身打造系统成长课程,带来涵盖云游戏、云原生、联邦学习、生信大数据、算力网络、云网融合等多个热门话题的前沿技术及案例实践。第一期:超视频时代 音视频架构建设与演进复制链接收看完整内容:https://bizwebcast.intel.cn/eventstart.aspx?eid=298&tc=yxq0921l2d&frm=csdn_2第二期:转化医学研究背景下的高性能计算平台复制链接收看完整内容:https://bizwebcast.intel.cn/eventstart.aspx?eid=311&tc=pzw21rx59o&frm=csdn_2第三期:联邦学习的研究与应用实践复制链接收看完整内容:https://bizwebcast.intel.cn/eventstart.aspx?eid=315&tc=0e8trfvt8i&frm=csdn_2第四期:用架构思维为云原生做减法复制链接收看完整内容:https://bizwebcast.intel.cn/eventstart.aspx?eid=316&tc=i2kgf55ggn&frm=csdn_2第五期:网络智能化技术与演进复制链接收看完整内容:https://bizwebcast.intel.cn/eventstart.aspx?eid=322&tc=ckhvmonqvb&frm=CSDN_2第六期:异构计算 数据中心“芯”变革复制链接收看完整内容:https://bizwebcast.intel.cn/eventstart.aspx?eid=325&tc=mzppx1h6ri&frm=csdn_2第七期:筑算力,话东西复制链接收看完整内容:https://bizwebcast.intel.cn/eventstart.aspx?eid=327&tc=gwb7n8x79n&frm=csdn_2第八期:AI驱动的生命科学创新范式之变复制链接收看完整内容:https://bizwebcast.intel.cn/eventstart.aspx?eid=328&tc=zircyqwy9u&frm=csdn_2第九期:软硬一体实现数据库性能优化复制链接收看完整内容:https://bizwebcast.intel.cn/eventstart.aspx?eid=348&tc=4a46kfrb0o&frm=csdn_2第十期:AI规模化应用时代的深度学习平台构建复制链接收看完整内容:https://bizwebcast.intel.cn/eventstart.aspx?eid=349&tc=fm9a1mrumb&frm=csdn_2

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧