词条统计
浏览次数:7090 次
编辑次数:7次 历史版本
最近更新:2013/6/20
创建者:掷鸡蛋者

本文原是论坛帖子,讨论在此处:http://www.wojilu.com/Forum1/Topic/133


我记录框一开始在设计的时候,就考虑到,动态页面和静态资源一定要分离。原因如下:

1、网址重写(rewrite)或路由(route)已经成为 web2.0 时代网站的基础功能

比如真实网址 articleShow.aspx?id=3 会被重写成 article/3.html 这个以“html”后缀名结尾的 url。而在 wojilu framework 中,虽然因为有路由系统,不需要像传统 web form 那样做重写(rewrite),但修改后缀名的需求仍然是必须的。Article/3.aspx在 seo 方面,似乎没有 Article/3.html 或 Article/3 来得好。

2、如何让 IIS 处理无后缀名的请求

为了让IIS服务器能够将无后缀名的请求(Article/3) 或“html”后缀名的请求交给 asp.net 处理,我们必须这样做(以处理无后缀名请求为例):

找到网站,右键“属性”->主目录->点击“配置”按钮

在“通配符应用程序映射(执行顺序)”右下点击“插入”

浏览“可执行文件”时,将目录定位到:

C:\WINDOWS\Microsoft.NET\Framework\ 2.0.50727\aspnet_isapi.dll

不要勾选“确认文件是否存在”


然后一路“确定”,完毕。


3、把静态资源分离出来

通过上面的设置,所有后缀名的请求都会被 asp.net 解析引擎接收,包括真正的静态资源,比如.css/.js 以及 jpg 等图片文件。这样的后果是性能大幅下降。

虽然asp.net不是不能处理静态文件,但在处理性能上,远远不及IIS直接的静态处理来得快。请想象一下,一个动态页面中包含了10张图片意味着什么?动态页面本身是一个动态请求,而页面中涉及到的 js/css 我们假设5条,页面中和涉及相关的图片(比如背景小图片)假设有5张(据google统计,互联网每个网页平均包含29张图片),这样总共的静态请求就是5+5+10=20条请求。也就是说,一个动态页面的请求附带了20条静态请求,让 asp.net 引擎本来只要处理一条动态请求的,现在集中起来要处理共21条请求,性能的下降是非常严重的。

正确的处理方式是,让这个站点只处理 asp.net 的动态页面;同时新建一个子站点,专门处理静态资源。这种处理方式,要求对静态资源进行统一的划分和归置。在 wojilu framework 中,所有的静态资源(包括用户上传的图片和文件)都放在网站的一个叫 /static 的目录下:


你新建的子站点,比如叫 static.wojilu.com 的根目录,可以指向到 这个 /static 目录。然后请修改 mvc.config 配置文件:


请看上面第二行,urlExt后面的值是空的;同时第四行 staticDomain 后面加上了值,就是子站点二级域名的名称。目前 wojilu framework 的静态资源分离方案只支持二级域名(我觉得完全够用了)。

4、如何在视图页面中引用静态资源

在没有将动态页面和静态资源分离的情况下,我们在页面中引用一张图片,可以这样:
     <img src="/static/upload/image/123.jpg" /> 
但这种方式非常不灵活,因为分离之后的静态资源实际是
    http://static.wojilu.com/upload/image/123.jpg
网址的变化导致你你必须逐页替换。

正确的做法是:
     <img src="~img/123.jpg" /> 
框架自动将 ~img/ 按不同情形解析:
    a)静态和动态资源没有分离的时候,解析成 /static/upload/image/
    b)分离之后解析成 http://static.wojilu.com/upload/image/ 

除了图片,其他几种静态资源的引用方式为:

快捷方式分离前指向静态分离后
~img//static/img/http://static.wojilu.com/img/
~css//static/css/http://static.wojilu.com/css/
~js//static/js/http://static.wojilu.com/js/
~static//static/http://static.wojilu.com/


注意:如上快捷方式的使用,必须是双引号直接连上符号~。比如 <img src='~img/123.jpg' /> 和 <img src=" ~img/123.jpg" /> 都是错的。前者错在用了单引号,后者错在引号和~img之间多个空格。


5、如何在 controller 的代码中引用静态资源

除了在页面视图中通过 "~img/" 这种方式引用之外,有时候你还需要在c#代码中引用这些静态资源的路径。

快捷方式分离前指向静态分离后
sys.Path.Img/static/img/http://static.wojilu.com/img/
sys.Path.Css/static/css/http://static.wojilu.com/css/
sys.Path.Js/static/js/http://static.wojilu.com/js/
sys.Path.Static/static/http://static.wojilu.com/
sys.Path.Photo/static/upload/image/http://static.wojilu.com/upload/image/


6、如何在上传文件的时候获取静态资源路径

在上传的时候(比如上传图片),不能使用 sys.Path.Img 这种方式获取路径,因为它会在静态分离的时候指向 http://static.wojilu.com/img/ ,这个子站点是不能接受上传的,所以 wojilu framework 又定义了一组路径用于上传时候使用::

快捷方式分离前指向静态分离后
sys.Path.DiskImg/static/img/同左
sys.Path.DiskCss/static/css/同左
sys.Path.DiskJs/static/js/同左
sys.Path.DiskUpload/static/同左
sys.Path.DiskPhoto/static/upload/image/同左