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> 和样式表之类的外部资源可能尚未加载完…

调用接口登录禅道_有java调用api登录并验证禅道的实例吗

展开全部本文实例为大家分享了32313133353236313431303231363533e78988e69d8331333363396466JAVA的短信验证码api调用代码&#xff0c;供大家参考&#xff0c;具体内容如下import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.IOException;import j…

[Docker]Docker快速上手学习笔记

0. 学习的一些疑问 如何热更新镜像(images)&#xff1f;&#xff08;你可以快速启动或者销毁容器。这种时间几乎是实时的&#xff09;如何热更新游戏服&#xff1f;好处在于各个应用之间环境相互独立&#xff0c;即使某一个容器崩溃也不会影响到其它容器&#xff1b;每个容器使…

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

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

计算机大数据的前景方向_计算机方向,网络与信息安全和大数据哪个前景好一点?...

大数据是我目前的研究方向之一&#xff0c;我也曾经做过网络安全相关的项目&#xff0c;主要涉及的是各种网络环境下数据传输的安全处理方案。另外&#xff0c;我曾经给高校的学生做过网络安全的系列讲座&#xff0c;系统地整理过网络安全的相关内容&#xff0c;所以我来谈一谈…

Smarty 显示大括号 | 在Smarty中计算数组元素的长度 | Smarty字符串拼接

参考链接&#xff1a;http://hi.baidu.com/bdusnb/item/289d160e6a9c92cd9157183d 参考链接&#xff1a;http://hi.baidu.com/mayimu789/item/b565088d047da0d05f0ec16f 参考链接&#xff1a;http://blog.sina.com.cn/s/blog_8155e74d0101el2k.html Smarty 3 &#xff1a;大…

ftp协议分析(一)

作者: 肖建彬 | 可以转载, 转载时务必以超链接形式标明文章原始出处和作者信息及版权声明网址&#xff1a;http://www.xiaojb.com/archives/it/ftp.shtml根据是使用port模式还是passive模式&#xff0c;ftp使用不同的tcp端口号&#xff0c;在详细描述ftp前&#xff0c;我们来简…

JavaScript 元编程

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

python 异常处理模块_扩展Python模块系列(五)----异常和错误处理

在上一节中&#xff0c;讨论了在用C语言扩展Python模块时&#xff0c;应该如何处理无处不在的引用计数问题。重点关注的是在实现一个C Python的函数时&#xff0c;对于一个PyObject对象&#xff0c;何时调用Py_INCREF和Py_DECREF。在编写C语言代码时&#xff0c;需要了解Python…

常见的php笔试题(附答案)搜集整理

转载链接&#xff1a;http://www.yaojinbu.com/p/139.html 常见的php笔试题&#xff08;附答案&#xff09;搜集整理 1.在PHP中&#xff0c;当前脚本的名称&#xff08;不包括路径和查询字符串&#xff09;记录在哪个预定义变量中&#xff1f;而链接到当前页面的URL又记录在哪个…

Js整理备忘(02)——运算符

1、运算符的表示以及优先级 Javascript&#xff08;以下简写为Js&#xff09;的大部分运算符与C或Java是类似的。 记得刚学C语言时老师讲的优先级口诀&#xff0c;非常好记&#xff1a;“括、单、算、移、关”“位、逻、条、赋、逗”&#xff0c;此处也可以套用一下&#xff0c…

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

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

第一篇cnblog!

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

解决error 1045: Access denied for user: 'root@localhost' (Using password: YES)

转载连接&#xff1a;http://jianfw2009.blog.163.com/blog/static/13431366020111016112459158/ 1、先停止mysql服务2、在mysql的目录下找到my.ini&#xff0c;在[mysqld]后面加上skip-grant-tables3、启动mysql服务,打开Command Line Client以空密码登录4、退出mysql,并停止服…

fillcolor是什么意思_fill是什么意思

1. (使)装满;(使)注满;(使)充满If you fill a container or area, or if it fills, an amount of something enters it that is enough to make it full.e.g.Fill a saucepan with water and bring to a slow boil...往平底锅里加满水,小火煮沸。e.g.She made sandwiches, fill…

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

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

MyISAM InnoDB 区别

转载链接&#xff1a;http://www.php100.com/html/webkaifa/database/Mysql/2011/0326/7789.html MyISAM 和 InnoDB 讲解 InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型&#xff0c;这两个表类型各有优劣&#xff0c;视具体应用而定。基本的差别为&#xff1a;MyISAM…

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

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

wpsmac和pc版的区别_Mac版WPS Office和微软Office 2019哪个更好?

众所周知&#xff0c; macOS系统生态下&#xff0c;有许多界面精美、功能强大、体验出色的软件&#xff0c;但提到办公套件&#xff0c;人们首先想到的还是微软 Office 套件&#xff0c;其中的Word、 Excel 以及PPT&#xff0c;但用户体验并不如意。但现在&#xff0c;苹果用户…

A tutorial video for MindManager for free

MindManager 2016 for Windows Essential Training 本人学习的时候使用的是MindManager 2018版本的&#xff0c;和2016版本差异不大。 转载于:https://www.cnblogs.com/kelamoyujuzhen/p/10253278.html