DotNetNuke 5 C#版本解读之2--HTTP Modules

在前面文章里说明了DNN的架构,下面这个图应该说是更加能够全面的让你去了解它的结构:

DNN-Architecture-NK20091201.png

如果你是个asp.net新手建议你看看前面这部分,因为它会向你介绍什么是http module,以及其他的一些概念。我想通过你读这篇文章来明白asp.net的机制,明白一些深层次的东西。我试着让大家我写的东西时不仅仅是跟着我去做某件事,而是了解了它。甚至去了解为什么要去做这件事。 废话太多了。。。

在进入主题http module之前需要你先了解几个概念,HTTP Pipeline.维基百科上对它的解释如下:

HTTP pipelining is a technique in which multiple HTTP requests are written out to a single socket without waiting for the corresponding responses. Pipelining is only supported in HTTP/1.1, not in 1.0.

The pipelining of requests results in a dramatic improvement[citation needed] in page loading times, especially over high latency connections such as satellite Internet connections.

Since it is usually possible to fit several HTTP requests in the same TCP packet, HTTP pipelining allows fewer TCP packets to be sent over the network, reducing network load.

Non-idempotent methods like POST should not be pipelined. Sequences of GET and HEAD requests can be always pipelined. A sequence of other idempotent requests like GET, HEAD, PUT and DELETE can be pipelined or not depending on whether requests in the sequence depend on the effect of others.[1]

HTTP pipelining requires both the client and the server to support it. HTTP/1.1 conforming servers are required to support pipelining. This does not mean that servers are required to pipeline responses, but that they are required not to fail if a client chooses to pipeline requests.

http://en.wikipedia.org/wiki/HTTP_pipelining

说白了就是不需要等待服务器的回应向服务器发送多个http请求,它大大降低了页面的加载时间。

Asp.net 提供了好几种方式来实现http pipeline。其中用的比较广泛的就是我们这里所说的http Module,一种用户自定义组件方式。

如果你英文好点建议你看如下这个链接来了解下HTTP Pipeline和http module,

http://msdn.microsoft.com/en-us/magazine/cc301362.aspx

http://msdn.microsoft.com/en-us/library/ms178473(v=VS.80).aspx

如果想看着舒服点的中文建议你看如下这位大哥写的介绍http请求处理流程的文章:

http://en.wikipedia.org/wiki/HTTP_pipelining

Http Handler的介绍:

http://www.tracefact.net/Asp-Net-Architecture/Introduction-to-Http-Handler.aspx

以及HTTP Module的介绍:

http://www.tracefact.net/Asp-Net/Introduction-to-Http-Module.aspx

里面包含了很多例子。你可以边看边学。而且讲得也非常好。

如果你认真看完了上面的内容我相信你已经了解了HTTP Module的作用。你也会了解了.net的项目中Global.asax是干嘛的了。大致的请求流程如下图:

 2010072102323348.gif

 

DNN 中HTTP Modules的演变和HTTP Module的事件

现在我们来看DNN的源代码有一部分叫做Http Modules。

 2010072102330392.gif

其实DNN之前的版本也是把http modules都放在了global.asax.vb里面(因为之前都是vb版本)。后来把这些模块给放到http module单独这个模块了。原因如下:

  1. 管理员可以在系统中添加/移除这些模块,因为本身是个module。
  2. 开发人员可以能够在不修改主程序也就是DNN.liabrary的情况下可以修改或者替换这些HTTP modules。
  3. 给大家提供了一个扩展HTTP Pipeline的模板。因为你可以自己加上自己的HTTP Module

上面我提供的参考文章里也有介绍.net framework自带的一些http module都在.net framewrok下有个config文件里放着,我们扩展后的HTTP Module也需要在

DNN的web.config中配置: 

 2010072102333089.jpg

我们知道HTTP Module都是继承了IhttpModule这个接口。

 2010072102334845.jpg

在Init方法中我们为context的某个事件来个委托。

HTTP Module的事件分为三种

  1. 应用程序执行之前发生。

主要有:

 BeginRequest:每次程序向服务器发送请求它都会被触发。

 AuthenticateRequest: 表示请求准备好服务器端的认证,认证模式下使用

 AuthorizeRequest: 表示请求准备好服务器端授权。

 ResolveRequestCache: 在Output Cache模块中通过使用缓存让请求更短。

 AcquireReuqestState: 表示能获得请求前的状态。

 PreRequesthandlerExecute: 在程序的http请求发生前你可以触发的最后一个事件。

应用程序执行之后发生:

PostRequestHandlerExecute:此事件在执行 HTTP 处理程序之后发生。 ReleaseRequestState:将会话状态重新存储在状态存储中。如果您要构建一个自定义

会话状态模块,则必须将您的状态重新存储在状态存储中。

UpdateRequestCache:此事件将输出重新写入输出缓存。如果您要构建自定义缓存模块,则可以将输出重新写入缓存中。

EndRequest:请求已完成。您可能希望构建一个调试模块,以便将整个请求的信息收集到一起,然后将信息写入页面中。

 

DNN中的URL Writer HTTP Module详细介绍 

URL重写是一个好的系统必须具备的。DNN的URL重写也是给大家提供了很多种URL重写的格式,归根到底也是为了URL的友好型,以及有利于SEO。下面这个就是DNN的一个友好的URL:

http://www.dotnetnuke.com/RoadMap/FriendlyURLs/tabid/622/default.aspx

如果你对URL的友好型不了解请直接Google下或者是请假下别人,这里不再罗嗦。

  URL重写实在HTTP Pipeline的请求进行时发生的,所以能够作为整个应用程序的事件。这里用到的HTTP Module事件是BeginRequest。也就是说每次一个页面

向服务器发送HTTP Handler请求前通过BeginRequest事件让服务器相信你的url是接下来请求的那个页面的。

     这种转换过程借助于SiteUrls.config文件中的正则表达式来完成。

<?xml version="1.0" encoding="utf-8" ?>

<RewriterConfig>

<Rules>

<RewriterRule>

<LookFor>.*/TabId/(\d+)(.*)/Logoff.aspx</LookFor>

<SendTo>∼/Admin/Security/Logoff.aspx?tabid=$1</SendTo>

</RewriterRule>

<RewriterRule>

<LookFor>.*/TabId/(\d+)(.*)/rss.aspx</LookFor>

<SendTo>∼/rss.aspx?TabId=$1</SendTo>

</RewriterRule>

<RewriterRule>

<LookFor>[ ˆ ?]*/TabId/(\d+)(.*)</LookFor>

<SendTo>∼/Default.aspx?TabId=$1</SendTo>

</RewriterRule>

</Rules>

</RewriterConfig>

 

可以看到里面的节点主要是LookFor和SendTo。没错。也就是说当程序发现URL是…tabid/622/rss.aspx时它就会去找到rrs.aspx?Tabid=622来获取内容。

后面的url是代码所能是别的url。

相同的道理如果url是

http://localhost/dotnetnuke_community_cs/tabid/21/portalid/0/Default.aspx 那么实际上的url是default.aspx?tabid=21。

当然你如果喜欢你可以强制性的去把某个url绝对比配,不使用正则表达式。

 

<RewriterRule>

<LookFor>.*/XXOO/Url.aspx</LookFor>

<SendTo>∼/default.aspx?tabid=622</SendTo>

</RewriterRule>

 

 

 

接下来我们分析下上面给出的基本的DNN url:

http://www.dotnetnuke.com/RoadMap/FriendlyURLs/tabid/622/default.aspx

  http://www.dotnetnuke.com --- 是整个网站的url

  RoadMap/FriendlyURLS---是导航菜单的名字。也就是1级菜单的名字。你可以到DNN官网上试试。

  Tabid/622/ ---是真实的url中的参数(?tabid=622)

  Default.aspx --- DNN中最重要那个页面吧。。。

 

当然了那个导航菜单是否需要显示在url中你可以通过web.config文件中friendlyurl部分来设定。可能对于一个小的网站你在主网站下不需要再分类了,

比如不需要分什么product, community等。

 2010072102341962.jpg

 DNN这种URL重写的方式最大的优点不需要从服务器查找数据来进行url的重写准备,而是使用正则表达式。我见过很多网站的URL重写时需要不停地

和数据库交互,对于大的网站这个很影响性能的。

 

上面这个URL格式是对于SEO有好处的,但是很多时候大家希望有一个容易记住的url也就是传说中的人性化。但是这个只适合小型网站,你就硬写入

上面那个配置文件中。DNN5也有一个配置能够让URL成为人类友好型的那种。这里不说了。

  DNN的URL重写也使用了Provider Module模式,别于大家去扩展它的URL重写。不得不佩服它的扩展性,无处不在啊。。。

 2010072102344391.jpg

 上面既然说它扩展性好,如何去写一个自己的URL重写provider呢?

 首先你需要创建一个Provider类是继承下面这个类的:

 2010072102352358.jpg

然后你在这些方法里面写入自己公司的url 从写规则。具体的我会在后面文章里给出例子。写完这个编译后,你只需要在web.config中把你的

provider加进来就可以了。

 

ContractedBlock.gifExpandedBlockStart.gif代码
<friendlyUrl defaultProvider="CustomFriendlyUrl">

<providers>

<clear />

<add name="DNNFriendlyUrl"

type="DotNetNuke.Services.Url.FriendlyUrl.DNNFriendlyUrlProvider,

DotNetNuke.HttpModules.UrlRewrite" includePageName="true"

regexMatch="[ ˆ a-zA-Z0-9 _-]"/>

<add name="CustomFriendlyUrl"

type="CompanyName.FriendlyUrlProvider, CompanyName.FriendlyUrlProvider" />

</providers>

</friendlyUrl>

 

 

 

上面只是粗略的说明了下DNN的url重写是如何进行的。代码级别的研究以及自定义url 规则都会单独有文章来介绍。

 PS:DNN的URL重写你如果掌握了,你完全可以把它移植出来到你的项目中。

 

DNN的Exception HTTP Module模块

上面url重写部分使用的是BeginRequest事件,而Exception模块我们需要在整个应用程序发生错误时就去执行某个方法。代码如下:
 
也同时会把这个异常信息存储到数据库中来供开发人员分析。
 
DNN的UserOnline HTTP Module
这个Module监听的是AuthorizeRequest事件。每当一个用户向服务器端发出身份认证时这个HTTP Module就会向服务器发送请求,useronlineprovider就会执行。
 
  DNN的usernolineprovider主要是使用Cookie来存放唯一标识的。这样可以防止那些在线的游客被重复记录。当然了这个功能主要是靠DNN的Scheduler模块
  在后台有个线程没几分钟去执行下。 
  DNN UserOnline模块的代码级别研究也会在以后一篇文章里介绍。这里你知道原理就行。
  其它还有Membership,Compression,RequestFilter,Analytics,Compression模块。Analytics这个功能我觉得对于很多监测网站数据访问量的人员来说是个很好的参考。
  我会把对它的说明和Requestfilter放在一块讲解。估计接下来Http Module部分还得写7-8篇文章才行。
 Cheers
 Nic

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/276245.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用框架的你,可能早已忽略了这些事件API

DOMContentLoaded&#xff0c;load&#xff0c;beforeunload&#xff0c;unloadHTML 页面的生命周期包含三个重要事件&#xff1a;DOMContentLoaded —— 浏览器已完全加载 HTML&#xff0c;并构建了 DOM 树&#xff0c;但像 <img> 和样式表之类的外部资源可能尚未加载完…

原来 Clipboard 还能复制图像?原理是什么

在写了 这个 29.7 K 的剪贴板 JS 库有点东西&#xff01; 这篇文章之后&#xff0c;收到了小伙伴提的两个问题&#xff1a;1.clipboard.js 这个库除了复制文字之外&#xff0c;能复制图像么&#xff1f;2.clipboard.js 这个库依赖的 document.execCommand API 已被废弃了&…

JavaScript 元编程

大家好&#xff0c;我是若川。今天给分享一篇来自freecodecamp的好文。我是freecodecamp杭州社区组织者之一&#xff0c;有一群小伙伴一起组织线下分享活动&#xff0c;不过2020年我们杭州社区几乎没有活跃&#xff0c;我也没有什么贡献。另外&#xff0c;我的公众号「若川视野…

手写一个合格的前端脚手架

为什么我们需要一套脚手架为什么我们需要一套脚手架&#xff0c;它能帮助我们解决哪些痛点问题。•前端项目配置越来越繁琐、耗时&#xff0c;重复无意义的工作•项目结构不统一、不规范•前端项目类型繁多&#xff0c;不同项目不同配置&#xff0c;管理成本高•脚手架也可以是…

第一篇cnblog!

本人才疏学浅&#xff0c;终于通过了cnblog的审核&#xff0c;兴奋之余&#xff0c;发表感言——不容易啊&#xff01;在我的博闻里面&#xff0c;随笔类当然就是技术类的比较多的&#xff0c;特别是实例类的。理论类的大部分放在文章板块&#xff0c;本人e文特别好(哈哈&#…

利用JMeter进行压力测试(1)(转)

转自&#xff1a;http://www.cnblogs.com/game-over/archive/2010/01/08/1642685.html压力测试以软件响应速度为测试目标&#xff0c;尤其是在较短时间内大量并发用户的同时访问时&#xff0c;软件的性能和抗压能力。 JMeter是一款开源的压力测试工具&#xff0c;目前最新Rele…

Git 内部原理图解——对象、分支以及如何从零开始建仓库

我们中的许多人每天都在使用 git&#xff0c;但是有多少人知道它的内部是怎么运作的呢&#xff1f;例如我们使用 git commit 时发生了什么&#xff1f;提交&#xff08;commit&#xff09;与提交之间保存的是什么&#xff1f;两次提交之间难道只是文件的差异&#xff08;dif…

Google, 请不要离开我们!

虽然我是.net阵营, 力挺Silverlight, 但是我真心希望谷歌留在中国, 如果她能够靠谈判求的言论自由的权利, 那将对中国的拥有自由信仰的一族产生重大的影响. 谷歌离开了中国, 不是她想抛弃中国市场, 而是中国决策者背叛了人性. 在此留下 Google 2010年1月14日的logo, 智慧的幽默…

28岁自学3年前端成功转行的励志故事

为什么转行因为混得不好。在成为程序员之前&#xff0c;我干过很多工作。由于学历的问题&#xff08;高中&#xff09;&#xff0c;我的工作基本上都是体力活。包括但不限于&#xff1a;工厂普工、销售&#xff08;没有干销售的才能&#xff09;、搬运工、摆地摊等&#xff0c;…

usb 驱动

usb 驱动学习总结&#xff1a; usb 采用分层的拓扑结构&#xff0c;金字塔型&#xff0c;最多是7层。usb 是主从结构&#xff0c;主和主或者从和从之间不能交换数据。理论上一个usb主控制器最多可接127个设备&#xff0c;协议规定每个usb设备具有一个7bit的地址&#xff0c;范围…

面试字节跳动后的2点总结,建议收藏!

首先我来辟个谣&#xff1a;随便打开一个招聘网站&#xff0c;你会发现前端工程师的岗位需求依旧庞大&#xff0c;大厂人才奇缺&#xff0c;就业薪资起点高&#xff0c;无行业限制。&#xff08;数据来源&#xff1a;职友集&#xff09;前端开发的行业大环境行业升级&#xff0…

phpexcel中文教程-设置表格字体颜色背景样式、数据格式、对齐方式、添加图片、批注、文字块、合并拆分单元格、单元格密码保护

转载连接&#xff1a;http://www.cnblogs.com/huangcong/p/3687665.html phpexcel中文教程-设置表格字体颜色背景样式、数据格式、对齐方式、添加图片、批注、文字块、合并拆分单元格、单元格密码保护 首先到phpexcel官网上下载最新的phpexcel类&#xff0c;下周解压缩一个cla…

2021年的今天,如何成为一名专业的前端工程师?

大家好&#xff0c;我是若川。今天给分享一篇来自阿里克军大佬的好文。以下是正文~如果你想成为一名专业的前端工程师&#xff0c;那么你需要了解要学什么&#xff0c;学到什么程度&#xff0c;以及如何有效地学习。大学里没有正规的前端技术课程&#xff0c;普遍缺少比较权威的…

nc65右键生成菜单_DbSchema生成表单和报表,原来如此简单

DbSchema 8 for Mac是mac上一款非常实用的商业数据库ER图绘制软件&#xff0c;可以轻松的对文档进行注释或标注&#xff0c;而且Dbschema集成了SQL和数据工具&#xff0c;能生成直观的图表、PDF文件或HTML 5文档等&#xff0c;非常的实用。现在就来给大家分享DbSchema如何生成表…

若川的2020年度总结,水波不兴

前言从2014年开始&#xff0c;每一年都会写年度总结&#xff0c;坚持了6个年头。回顾2014&#xff0c;约定2015&#xff08;QQ空间日志&#xff09;2015年总结&#xff0c;淡化旧标签&#xff0c;无惧未来&#xff08;QQ空间日志&#xff09;2016年度总结&#xff0c;毕业工作2…

年度总结文章的抽奖结果公布

大家好&#xff0c;我是若川。2月4日&#xff0c;发表了我的2020年度总结文章《若川的2020年度总结&#xff0c;水波不兴》&#xff0c;本以为阅读量应该突破一千会比较快&#xff0c;实际上比较艰难&#xff0c;而且还掉粉10来人。2020年运营公众号以来&#xff0c;不知不觉发…

Elon Musk

人物事件 成长学习 1971年6月28日&#xff0c;埃隆马斯克在南非的比勒陀利亚出生&#xff0c;他的 埃隆马斯克 父亲是一名南非机电工程师&#xff0c;母亲是加拿大人&#xff0c;从事营养师兼模特。[8] 1981年&#xff0c;10岁的马斯克就拥有了自己的第一台电脑&#xff0c;并…

真诚推荐这7个大佬的公众号,碎片化学习

逆水行舟&#xff0c;不进则退。我们的工作已经占用了大块的时间了&#xff0c;剩下的只有各种碎片&#xff0c;最适合碎片时间学习的&#xff0c;莫过于优质的技术干货公众号啦~以下这些是小编精选&#xff0c;里面有很多资讯和资源&#xff0c;内含干货&#xff0c;希望能给大…

[转]Windows 7 产品密钥是否安全

提到Windows 7&#xff08;或Windows Server 2008&#xff09;有些人认为自己的产品密钥&#xff08;Product Key&#xff09;很安全&#xff0c;甚至在公司内部有些网管也认为公司部署的Windows 7 系统的密钥不会泄露。但其实并非如此&#xff0c;众所周知我们的密钥都是写在注…

HttpWatch的Result中出现Aborted的原因分析[配图]

转载链接&#xff1a;http://www.cnblogs.com/yutiansanshou/archive/2013/02/01/2889486.html 我们在使用HttpWatch进行Web调试的过程中有时候会看到非HTTP Status Code&#xff08;状态码&#xff09;的值&#xff0c; 例如&#xff1a;(Aborted)。 (Aborted)是HttpWatch中定…