各位高手,谁知道.net怎么做到动态页面静态化,请给出具体实用的方法。谢谢
一个新闻消息系统类型的网站,有大量的连接,都是从数据库里读取,如何做到页面静态化,请各位高手帮帮忙,谢谢!...
一个新闻消息系统类型的网站,有大量的连接,都是从数据库里读取,如何做到页面静态化,请各位高手帮帮忙,谢谢!
展开
2013-10-27
展开全部
http://www.cnblogs.com/suyuan/articles/1134315.html
去这里看看,里面很详细(含图)
以下是摘要:
服务器压力过大?一个有效的办法是将内容静态化.静态页面的访问速度比起动态页面那是绝对的优势.
目前网站静态化的方案(不谈技术)根据总结主要有三种:
实时的静态化,即增删改后立即生成对应的静态文件
定时静态化或者手工静态化,即增删改后有程序控制在预定的时间内进行一次静态化批量生成,或者手工批量生成
以上两种方法是大部分网站都经常使用的方法,但是他们有一个共同的缺点就是,生成了大量的不受关注的页面,占用服务器磁盘空间.
那么有什么好的方法来解决上面的问题么?答案是肯定的
看看下面这个流程图(画的不好,多包涵)
充分利用了服务器404错误页面可以自己指定的优势,来完成首次访问的静态化.
结合数据库,减少IO的操作次数,保证所生成的页面绝对是用户访问过的页面,
甚至可以对以下的方案进行扩充,根据页面的受关注程度,定期可以删除一些受关注程度较低的页面,进而节约磁盘空间,特别是购买别人空间的朋友尤其有用!
我根据以上的思想做了一个简单的demo
使用的是aspx
在webconfig中配置 如下:(也可以通过IIS)
<customErrors mode="On" defaultRedirect="Loginc.aspx">
Loginc的代码如下:
protected void Page_Load(object sender, EventArgs e)
{
string url = SyRequest.GetQueryString("aspxerrorpath");
url = url.Substring(1, url.LastIndexOf(".")-1);
if (url.IndexOf("_") > -1)
{
string page = url.Split('_')[0];
int toid =Utils.StrToInt(url.Split('_')[1],-1);
switch (page)
{
case "hospital":
Response.Redirect("hospital.aspx?id=" + toid);
break;
}
}
}Hospital.aspx页面代码:
protected override void Render(HtmlTextWriter writer)
{
string StaticFileName = "hospital_"+SyRequest.GetQueryInt("id", -1)+".html";
StreamWriter r = new StreamWriter(Server.MapPath(StaticFileName),
false, System.Text.Encoding.UTF8); //StaticFileName是html文件名
HtmlTextWriter h = new HtmlTextWriter(r);
base.Render(h);
r.Close();
h.Close();
Response.Redirect(StaticFileName);
}以上就是一个大致的过程,希望大家可以提出不同的见解,mygtalk:suyuan19@gmail.com
同时有一个问题就是:当很多人同时访问同一个未生成的页面时,会出现什么情况呢?具体的我还没有测试
去这里看看,里面很详细(含图)
以下是摘要:
服务器压力过大?一个有效的办法是将内容静态化.静态页面的访问速度比起动态页面那是绝对的优势.
目前网站静态化的方案(不谈技术)根据总结主要有三种:
实时的静态化,即增删改后立即生成对应的静态文件
定时静态化或者手工静态化,即增删改后有程序控制在预定的时间内进行一次静态化批量生成,或者手工批量生成
以上两种方法是大部分网站都经常使用的方法,但是他们有一个共同的缺点就是,生成了大量的不受关注的页面,占用服务器磁盘空间.
那么有什么好的方法来解决上面的问题么?答案是肯定的
看看下面这个流程图(画的不好,多包涵)
充分利用了服务器404错误页面可以自己指定的优势,来完成首次访问的静态化.
结合数据库,减少IO的操作次数,保证所生成的页面绝对是用户访问过的页面,
甚至可以对以下的方案进行扩充,根据页面的受关注程度,定期可以删除一些受关注程度较低的页面,进而节约磁盘空间,特别是购买别人空间的朋友尤其有用!
我根据以上的思想做了一个简单的demo
使用的是aspx
在webconfig中配置 如下:(也可以通过IIS)
<customErrors mode="On" defaultRedirect="Loginc.aspx">
Loginc的代码如下:
protected void Page_Load(object sender, EventArgs e)
{
string url = SyRequest.GetQueryString("aspxerrorpath");
url = url.Substring(1, url.LastIndexOf(".")-1);
if (url.IndexOf("_") > -1)
{
string page = url.Split('_')[0];
int toid =Utils.StrToInt(url.Split('_')[1],-1);
switch (page)
{
case "hospital":
Response.Redirect("hospital.aspx?id=" + toid);
break;
}
}
}Hospital.aspx页面代码:
protected override void Render(HtmlTextWriter writer)
{
string StaticFileName = "hospital_"+SyRequest.GetQueryInt("id", -1)+".html";
StreamWriter r = new StreamWriter(Server.MapPath(StaticFileName),
false, System.Text.Encoding.UTF8); //StaticFileName是html文件名
HtmlTextWriter h = new HtmlTextWriter(r);
base.Render(h);
r.Close();
h.Close();
Response.Redirect(StaticFileName);
}以上就是一个大致的过程,希望大家可以提出不同的见解,mygtalk:suyuan19@gmail.com
同时有一个问题就是:当很多人同时访问同一个未生成的页面时,会出现什么情况呢?具体的我还没有测试
Storm代理
2023-08-29 广告
2023-08-29 广告
"StormProxies是全球大数据IP资源服务商,其住宅代理网络由真实的家庭住宅IP组成,可为企业或个人提供满足各种场景的代理产品。点击免费测试(注册即送1G流量)StormProxies有哪些优势?1、IP+端口提取形式,不限带宽,I...
点击进入详情页
本回答由Storm代理提供
2013-10-27
展开全部
asp.net的运行机制,更倾向于用服务器缓存来解决效率问题。虽然生成静态是最彻底的解决效率问题的方式,但是代价也大,比如列表页分页的问题,新加入的数据搞不好会造成整个几十页的页面需要重新生成,就算再彻底的生成静态方案都无法很好地解决这个问题,生成静态页的代价就是丧失页面的数据关联性。
微软也推崇用服务器缓存解决效率这个问题。从我实际的经验上来看,代码中合理的缓存机制对服务器的压力不会比纯静态高多少,对于asp.net程序来说,10人频繁访问与1万人频繁访问对CPU和硬盘的开销没有本质意义上的区别(除非网络带宽不够用),我做.net的项目已经很多了。最大的项目日访问IP达到百万级,PV达到千万级,放心吧,用服务器缓存去解决。这样对维护来说难度也要小很多,每次换模板调整模板只需要改代码就行,不像静态的要全部重新生成,十多万的页面生成都要几个小时。
微软也推崇用服务器缓存解决效率这个问题。从我实际的经验上来看,代码中合理的缓存机制对服务器的压力不会比纯静态高多少,对于asp.net程序来说,10人频繁访问与1万人频繁访问对CPU和硬盘的开销没有本质意义上的区别(除非网络带宽不够用),我做.net的项目已经很多了。最大的项目日访问IP达到百万级,PV达到千万级,放心吧,用服务器缓存去解决。这样对维护来说难度也要小很多,每次换模板调整模板只需要改代码就行,不像静态的要全部重新生成,十多万的页面生成都要几个小时。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-10-27
展开全部
//生成HTML页
public static bool WriteFile(string strText,string strContent,string strAuthor)
{
string path = HttpContext.Current.Server.MapPath("/news/");
Encoding code = Encoding.GetEncoding("gb2312");
// 读取模板文件
string temp = HttpContext.Current.Server.MapPath("/news/text.html");
StreamReader sr=null;
StreamWriter sw=null;
string str="";
try
{
sr = new StreamReader(temp, code);
str = sr.ReadToEnd(); // 读取文件
}
catch(Exception exp)
{
HttpContext.Current.Response.Write(exp.Message);
HttpContext.Current.Response.End();
sr.Close();
}
string htmlfilename=DateTime.Now.ToString("yyyyMMddHHmmss")+".html";
// 替换内容
// 这时,模板文件已经读入到名称为str的变量中了
str =str.Replace("ShowArticle",strText); //模板页中的ShowArticle
str = str.Replace("biaoti",strText);
str = str.Replace("content",strContent);
str = str.Replace("author",strAuthor);
// 写文件
try
{
sw = new StreamWriter(path + htmlfilename , false, code); //为false时候是覆盖,true为追加
sw.Write(str);
sw.Flush();
}
catch(Exception ex)
{
HttpContext.Current.Response.Write(ex.Message);
HttpContext.Current.Response.End();
}
finally
{
sw.Close();
}
return true;
public static bool WriteFile(string strText,string strContent,string strAuthor)
{
string path = HttpContext.Current.Server.MapPath("/news/");
Encoding code = Encoding.GetEncoding("gb2312");
// 读取模板文件
string temp = HttpContext.Current.Server.MapPath("/news/text.html");
StreamReader sr=null;
StreamWriter sw=null;
string str="";
try
{
sr = new StreamReader(temp, code);
str = sr.ReadToEnd(); // 读取文件
}
catch(Exception exp)
{
HttpContext.Current.Response.Write(exp.Message);
HttpContext.Current.Response.End();
sr.Close();
}
string htmlfilename=DateTime.Now.ToString("yyyyMMddHHmmss")+".html";
// 替换内容
// 这时,模板文件已经读入到名称为str的变量中了
str =str.Replace("ShowArticle",strText); //模板页中的ShowArticle
str = str.Replace("biaoti",strText);
str = str.Replace("content",strContent);
str = str.Replace("author",strAuthor);
// 写文件
try
{
sw = new StreamWriter(path + htmlfilename , false, code); //为false时候是覆盖,true为追加
sw.Write(str);
sw.Flush();
}
catch(Exception ex)
{
HttpContext.Current.Response.Write(ex.Message);
HttpContext.Current.Response.End();
}
finally
{
sw.Close();
}
return true;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询