惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
博客园 - Franky
GbyAI
GbyAI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
爱范儿
爱范儿
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recent Announcements
Recent Announcements
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
C
CERT Recently Published Vulnerability Notes
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
L
LangChain Blog
L
LINUX DO - 最新话题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
H
Hacker News: Front Page
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
AI
AI
T
Troy Hunt's Blog
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
罗磊的独立博客
S
Secure Thoughts
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
S
Security @ Cisco Blogs
Cloudbric
Cloudbric
E
Exploit-DB.com RSS Feed
Attack and Defense Labs
Attack and Defense Labs

博客园 - 彭斌

[博客园广州俱乐部活动通知]Windows 7社区发布(2009-10-24) 广州.NET俱乐部活动通知(3月30日 星期天) 我的生活博客和相册 微软广州.NET 俱乐部2008新技术激情碰撞活动报道 广州.NET俱乐部活动通知(11月17日) 微软广州.NET俱乐部活动通知(08月18日) Pontus Portal 展现层次结构 广州.NET俱乐部 VSTS活动报道 广州.NET俱乐部 VSTS专题日(4月15日) 线下交流活动 微软广州.NET俱乐部活动通知(11月19日) 微软广州.NET俱乐部活动预告 致歉微软广州.net俱乐部会员 SQL LIKE 通配符随笔 Community Server2.0专注细节专题Doc下载(2006-3-9更新) Community Server2.0专注细节一 邮件提醒按钮实现(上) - 彭斌 Community Server 2.0中如何调试项目?我告诉你! CommunityServer 2.0中Files 与 Reader 项目的授权机制 Community Server 2.0 (SDK) 发布了 广州.NET 俱乐部联系邮件变更通知
Portal 页面加载引擎思考(上)
彭斌 · 2007-04-28 · via 博客园 - 彭斌

本文就DNN页面生成引擎随笔与思考,同时会牵涉到CommunityServer的Skin机制、Url Rewriter、SharePoint知识。
在DNN中,只有为数不多的几个页面(.aspx),除去核心机制外,大多数业务逻辑都写在用户控件里(.ascx),那DNN是如何展现出千变万化的页面的呢?分析之后,你会发现,所谓千变万化的页面只是url rewriter结合一种页面加载(生成)引擎综合的结果。在这个加载过程中主要按如下步骤进行:
1:编写一个IHttpModule的扩展,并且捕获其中的BeginRequest事件

public class UrlRewriteModule : IHttpModule
{
    
public string ModuleName
    
{
        
get return "UrlRewriteModule"; }
    }

        
    
public void Init (HttpApplication application)
  
{
        application.BeginRequest 
+= new System.EventHandler(this.OnBeginRequest);
    }


    
public void OnBeginRequest (object sender, EventArgs e)
    
{
        
//处理逻辑
    }

}

在Url Rewriter处理逻辑里,一般会用到正则表达式来进行Url 的匹配。以DDN为例子,几乎所有(但不是全部)的页面请求都被Rewriter到default.aspx页面,只是default.aspx后面的QueryStrings(url 问号后面的参数)不同(这很重要)。
2:有了上面的步骤,现在可以把焦点集中在default.aspx页面里,但是default.aspx页面里并没有放置所有的业务逻辑,而只有一个容器(placeholder一类的东西),余下的就是加载用户控件(.ascx)到这个容器里了。DNN中采用了和CommunityServer类似的方式来加载用户控件(.ascx),但显得没有CommunityServer高明,至少从MVC或MVP模式来看是这样。作为Portal,加载控件用户控件只不过是程序员理解的行为,从维护门户的管理人员来看,这还会复杂一些。在DNN中,在页面加载时,用户控件(.ascx)会被赋予不同的使命,有Skin,Container,以及Module(对于这几个词汇,我更喜欢这样称呼他:Skin-->Layout、Container-->Zone,Module-->Module or Part)。他们之间是存在包含关系的,Skin 就是页面的布局,在Skin中包含有一个或多个Container,Container中用来装载Module。 其实在sharepoint 中Container叫WebPartZone,而Module叫WebPart,这样似乎会好理解一些。
3:在第一个步骤里,我们得到一些 QueryStrings,有了他们就可以通过数据库或者配置文件去加载不同的Skin、Container与Module,而Skin通过public Control LoadControl (string virtualPath )来加载Container,同样,Container也通过它来加载Module。

至此,页面就被呈现给用户了。
有待进一步思考:
以上过程看似简单,但是要处理好这些URL还真不是件容易的事情,DNN中花费大量的代码来做URL处理与QueryStrings判断,但URL还是不够友好,而SharePoint显得在URL上美观很多。
效率问题,Portal大多访问量较大,类似DNN这样多嵌套与多用户控件的加载效率上不容乐观,SharePoint也有类似问题。
页面呈现的层次结构,DNN的Portal->Tab(Page)->Module或者SharePoint的Portal->Site->Page->WebPart,哪一种更能体现用户需求。