当前位置:编程学习 > C#/ASP.NET >>

.text urlRewrite介绍

答案:     1、花絮:
  第一次拿到dottext时,开始让我比较觉得比较奇怪的是
  
  一、以floerggyy注册后通过URL:http://x.x.x.x/floerggyy即可进入自己的blog里
  (其实忘了以前常做下载页面download.aspx也不过是处理了HttpHandler的虚页面而已,可能是见在.Text兴奋的连这些基本常识都忘了^_^)
  
  二、居然可以拿用户名做用户的唯一标识但在表里面没有找到做为用户名UserName唯一约束的东东(到现在还不清楚在数据库哪个地方设置的,有知道的请指点下)
  后来通过重得注册同一用户名查看抛出的异常信息,确认确实在有UserName做为唯一约束的东东。
  唉,看来我对数据库一无所知。
  
  
  
  ...后来决定专写一篇关于URL重写的文章,后来看到dottext的原作者也简单介绍了下urlRewrite,于是这个想法就放弃了。
  后来又有一些朋友问dottext关于URL的问题,看来还是写吧
  
  2、配置文件WebConfig.config简单浏览
  
  自定义配置节内容:
   <configSections>
   <section name="BlogConfigurationSettings" type="Dottext.Framework.Util.XmlSerializerSectionHandler, Dottext.Framework" />
   <section name="HandlerConfiguration" type="Dottext.Framework.Util.XmlSerializerSectionHandler, Dottext.Framework" />
   <section name="SearchConfiguration" type="Dottext.Framework.Util.XmlSerializerSectionHandler, Dottext.Framework" />
   <section name="microsoft.web.services" type="Microsoft.Web.Services.Configuration.WebServicesConfiguration, Microsoft.Web.Services, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
   <section name="codeHighlighter" type="ActiproSoftware.CodeHighlighter.CodeHighlighterConfigurationSectionHandler, ActiproSoftware.CodeHighlighter" />
   </configSections>
  
  HttpHandler的配置内容:
   <httpHandlers>
   <add verb="*" path="*.asmx" type="System.Web.Services.Protocols.WebServiceHandlerFactory, System.Web.Services, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
   validate="false" />
   <add verb="*" path="Error.aspx" type="System.Web.UI.PageHandlerFactory" />
   <add verb="*" path="*" type="Dottext.Common.UrlManager.UrlReWriteHandlerFactory,Dottext.Common" />
   </httpHandlers>
  
  HttpModule的配置内容:
   <httpModules>
   <add name="UrlReWriteModule" type="Dottext.Common.UrlManager.UrlReWriteModule, Dottext.Common" />
   <add name="EventHttpModule" type="Dottext.Framework.ScheduledEvents.EventHttpModule, Dottext.Framework" />
   </httpModules>
  
  
  
  见到一个陌生的项目首先打开它的配置文件看看,这是我的习惯:)
  先看看一些重点的配置内容:
  
  看完Web.config中的上述内容熟悉asp.net运行机制的朋友就明白,DotText代码的运行顺序。在这里我再简单重复下
  aspnet的内部运行机制(若有不熟悉的朋友请参阅<<ASP.NET FameWork深度历险>>这本书,它对做asp.net开发的朋友很有帮助):
  remote client Request---->IIS---->aspnet_isapi.dll-->aspnet_wp.exe-->HttpRuntime--->
  HttpModule--->HttpHandler Factory--->HttpHandler--->HttpHandler.ProcessRequest()-->Response client Request
  好了,题归正转,client Request首先是被HttpModule截获。当我们请求.text的URL:http://www.cnblogs.com/floerggyy/时,首先是
  Dottext.Common.UrlManager命名空间下类UrlReWriteModule的相关方法被调用。
  (为什么会被类UrlReWriteModule截获远程请求呢?上面HttpModule配置节的内容不是标明了吗???^_^
  明知故问,那么为Dottext.Framework.ScheduledEvents命名空间下的类EventHttpModule会不会截获远程请求?什么时候截获呢?
  当然是按先来后顺序了,中国的优良传统都忘了!!!
  (其实这样说也是不太准确的,这两个HttpModule确是按顺序执行的但在HttpModule里的一些事件中它们是交叉运行的,好了类EventHttpModule
  不在我们的计论范围内在下面的代码就不分析了,有对这块不明白的最好去看下上面推荐的那本书^_^)
  
  3 、URL重写,部分代码分析(这块涉及到众多自定义配置节、HttpModule、HttpHandler的综合应用所以要理顺还是有点麻烦的,要有一小点分析别人代码的耐心。个人认为)
  
  类UrlReWriteModule的方法
  
  
  private void context_BeginRequest(object sender, EventArgs e){
  //它是主要作用是根据请求匹配正则表达式来设置是否重写客户所请求的URL(它默认是重写URL),注意这句代码UrlHelper.SetEnableUrlReWriting(context,false);
   if(ConfigProvider.Instance().IsAggregateSite){
   HttpContext context = ((HttpApplication)sender).Context;
  
   string path = context.Request.Path.ToLower();
   int iExtraStuff = path.IndexOf(".aspx");
   if(iExtraStuff > -1 || path.IndexOf(".") == -1) {
   if(iExtraStuff > -1)
   {
   path = path.Remove(iExtraStuff+5,path.Length - (iExtraStuff+5));
   }
  
   path = regexApplication.Replace(path,string.Empty,1,0);
  
   if(path == "" || path == "/" || regexPath.IsMatch(path))
   {
   UrlHelper.SetEnableUrlReWriting(context,false);
   }
  
   }else if(context.Request.Path.ToLower().IndexOf("services") > 0 && context.Request.Path.ToLower().IndexOf(".asmx") > 0 )
   {
   if(AlllowService(context))
   {
   if(context.Request.RequestType!="POST")
   {
   string regexstr=@"/\w+/services/";
   string url=Regex.Replace(context.Request.RawUrl,regexstr,"/services/",RegexOptions.IgnoreCase);
   context.RewritePath(url);
   }
   //string fileName =context.Request; //System.IO.Path.GetFileName(context.Request.Path);
   //context.RewritePath("~/Services/" + fileName);
   }else{
   context.Response.Clear();
   context.Response.End();
   }
   }
  
   }
  
  
  
  HttpModule处理完后(这句话并不正确,在这里是这样的)进入HttpHandler Factory,根据HttpHandler的配置内容我们可以马上找到这个类
  UrlReWriteHandlerFactory它是处理重写URL请求核心,在这里我详细分析下。
  它实现了IHttpHandlerFactory
  (看注释就知道这个类是很重要的了)
  
  
  HttpModule处理完后(这句话并不正确,在这里是这样的)进入HttpHandler Factory,根据HttpHandler的配置内容我们可以马上找到这个类
  UrlReWriteHandlerFactory它是处理重写URL请求核心,在这里我详细分析下。
  它实现了IHttpHandlerFactory
  (看注释就知道这个类是很重要的了)
  
  using System;
  using System.Web;
  using System.Web.UI;
  using System.Text.RegularExpressions;
  
  using Dottext.Framework;
  using Dottext.Framework.Components;
  using Dottext.Framework.Configuration;
  
  namespace Dottext.Common.UrlManager
  {
   /**//// <summary>
   /// Class responisble for figuring out which .Text page to load. By default will load an array of Dottext.UrlManager.HttpHanlder
   /// from the blog.config file. This contains a list of Regex patterns to match the current request to. It also allows cac

上一个:利用 ASP.NET 的内置功能抵御 Web 攻击
下一个:ASP.NET中为DataGrid添加合计字段

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,