分享
 
 
 

.text urlRewrite介绍。。

王朝asp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

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 caching of the

/// Regex's and Types

/// </summary>

public class UrlReWriteHandlerFactory: IHttpHandlerFactory

{

public UrlReWriteHandlerFactory()
{} //Nothing to do in the cnstr

//自定义虚方法从自定义配置节内容反序列化时构造Httphandler

protected virtual HttpHandler[] GetHttpHandlers(HttpContext context)

{

return HandlerConfiguration.Instance().HttpHandlers;

}

/**//// <summary>

/// Implementation of IHttpHandlerFactory. By default, it will load an array of HttpHanlder (Dottext.UrlManager.HttpHandler) from

/// the blog.config. This can be changed, by overrideing the GetHttpHandlers(HttpContext context) method.

/// </summary>

/// <param name="context">Current HttpContext</param>

/// <param name="requestType">Request Type (Passed along to other IHttpHandlerFactory's)</param>

/// <param name="url">The current requested url. (Passed along to other IHttpHandlerFactory's)</param>

/// <param name="path">The physical path of the current request. Is not gaurenteed to exist (Passed along to other IHttpHandlerFactory's)</param>

/// <returns>

/// Returns an Instance of IHttpHandler either by loading an instance of IHttpHandler or by returning an other

/// IHttpHandlerFactory.GetHanlder(HttpContext context, string requestType, string url, string path) method

/// </returns>

//实现接口IHttpHandlerFactory定义的方法

public virtual IHttpHandler GetHandler(HttpContext context, string requestType, string url, string path)

{

//Get the Handlers to process. By defualt, we grab them from the blog.config

HttpHandler[] items = GetHttpHandlers(context);

//Dottext.Framework.Logger.LogManager.Log("path",Dottext.Framework.Util.Globals.RemoveAppFromPath(context.Request.Path,context.Request.ApplicationPath));

//Do we have any?

if(items != null)

{

int count = items.Length;

for(int i = 0; i<count; i++)

{

//We should use our own cached Regex. This should limit the number of Regex's created

//and allows us to take advantage of RegexOptons.Compiled

//逐个匹配所配置节中定义的请求类型

if(items[i].IsMatch(Dottext.Framework.Util.Globals.RemoveAppFromPath(context.Request.Path,context.Request.ApplicationPath)))

{

//注意这里是关键,注意返回的Httphandler实例

//throw new Exception();

switch(items[i].HandlerType)

{

case HandlerType.Page://默认是Page

return ProccessHandlerTypePage(items[i],context,requestType,url);

case HandlerType.Direct:

HandlerConfiguration.SetControls(context,items[i].BlogControls);

return (IHttpHandler)items[i].Instance();

case HandlerType.Factory:

//Pass a long the request to a custom IHttpHandlerFactory

return ((IHttpHandlerFactory)items[i].Instance()).GetHandler(context,requestType,url,path);

default:

throw new Exception("Invalid HandlerType: Unknown");

}

}

}

}

//If we do not find the page, just let ASP.NET take over

return PageHandlerFactory.GetHandler(context,requestType,url, path);

}

private IHttpHandler ProccessHandlerTypePage(HttpHandler item, HttpContext context, string requestType, string url)

{

string pagepath = item.FullPageLocation;

if(pagepath == null)

{

pagepath = HandlerConfiguration.Instance().FullPageLocation;

}

HandlerConfiguration.SetControls(context,item.BlogControls);

IHttpHandler myhandler=PageParser.GetCompiledPageInstance(url,pagepath,context);

return myhandler;

}

public virtual void ReleaseHandler(IHttpHandler handler)

{

}

}

}

要注意它是如何把自定义配置节中的内容拈合成httphandler的实例

把这些理顺后对于理解.text的url重写就不难了

....

对上面若有理解不正解的欢迎高手指正

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有