none
URL重写 RRS feed

  • 问题

  • http://msdn.microsoft.com/zh-cn/library/ms972974.aspx

    看了这个URL重写的例子有一点不明白.

     public virtual IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
            {
                string strSendToUrl = url;
                string strFilePath = pathTranslated;
                RewriterRuleCollection rules = RewriterConfiguration.GetConfig().Rules;
                for (int i = 0; i < rules.Count; i++)
                {
                    string strLookFor = "^" + RewriterUtils.ResolveUrl(context.Request.ApplicationPath, rules[i].LookFor) + "$";
                    Regex re = new Regex(strLookFor, RegexOptions.IgnoreCase);
                    if (re.IsMatch(url))
                    {
                        strSendToUrl = RewriterUtils.ResolveUrl(context.Request.ApplicationPath, re.Replace(url, rules[i].SendTo));
                        string strSendToUrlLessQString;
                        RewriterUtils.RewriteUrl(context, strSendToUrl, out strSendToUrlLessQString, out strFilePath);
                        return PageParser.GetCompiledPageInstance(strSendToUrlLessQString, strFilePath, context);
                    }
                }
                return PageParser.GetCompiledPageInstance(url, strFilePath, context);
            }

    这个重写应该是在工厂类里进行的吧.

    那么那个ModuleRewriter有什么用?什么时候会调用到这个类?


    2010年3月29日 2:33

答案

  • 你好,

    那篇文档说了上面的例子都是在ASP.NET 级别进行处理。ASP.NET级别主要是指从Application开始的我们可控阶段。

    而且“HTTP 处理程序工厂必须实现 IHttpHandlerFactory 接口,此接口包括 GetHandler() 方法”已经说明了会调用HttpHandler工厂来实现重写。

    它是采用了设计模式中的工厂模式来返回HttpHandler。

    我们平常所写的每个继承于Page的后台代码其实就是一个Handler,最后都会在上面的工厂中被实例化然后用来处理页面请求。

    各种HttpModule模块是先于Handle之前调用的,所以这里只有先利用重写Module对请求进行重写后,再在handle中对请求进行处理。

    上面例子是把请求的地址转换成真实的存在的地址,以便后面调用相应的Handle进行处理。

    你可以看看一些关于ASP.NET Pipeline方法的书籍就了解了。


    Microsoft Online Community Support
    • 已标记为答案 male110 2010年3月30日 5:53
    2010年3月30日 5:50

全部回复

  • 哦,是不是说一个是HttpHandler,一个是HttpModule两种不同的方式
    2010年3月29日 2:53
  • IHttpHandlerFactory,跟HttpHandler有什么区别?

    这个重写是在IHttpHandlerFactory中实现的,什么时候调用IHttpHandlerFactory,什么时候调用IhttpHandler


    2010年3月30日 2:18
  • 比如如何实现http://abc.domain.com/ 到 http://www.domain.com/userpage.aspx?user=abc的重写?
    2010年3月30日 2:42
  • 只有aspx扩展名的才会被HttpHandlerFactory重写吧.

    http://abc.domain.com/

    IHttpHandlerFactory里的代码跟本不会被执行吧


    2010年3月30日 3:02
  • 你好,

    那篇文档说了上面的例子都是在ASP.NET 级别进行处理。ASP.NET级别主要是指从Application开始的我们可控阶段。

    而且“HTTP 处理程序工厂必须实现 IHttpHandlerFactory 接口,此接口包括 GetHandler() 方法”已经说明了会调用HttpHandler工厂来实现重写。

    它是采用了设计模式中的工厂模式来返回HttpHandler。

    我们平常所写的每个继承于Page的后台代码其实就是一个Handler,最后都会在上面的工厂中被实例化然后用来处理页面请求。

    各种HttpModule模块是先于Handle之前调用的,所以这里只有先利用重写Module对请求进行重写后,再在handle中对请求进行处理。

    上面例子是把请求的地址转换成真实的存在的地址,以便后面调用相应的Handle进行处理。

    你可以看看一些关于ASP.NET Pipeline方法的书籍就了解了。


    Microsoft Online Community Support
    • 已标记为答案 male110 2010年3月30日 5:53
    2010年3月30日 5:50