text urlRewrite介绍
| |||||
|
1、花絮:
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代码的运行顺序。在这里我再简单重复下 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(); } } }![]()
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的实例 对上面若有理解不正解的欢迎高手指正 |








}
}
浙公网安备 33010602011771号