none
URL重写的问题 RRS feed

  • 问题

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

    这里有一个HttpHandler的实现,发现有一点问题。

      public class RewriterFactoryHandler:HttpHandlerFactory

    {

     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);
            }

    }

     我的配置文件

    <add verb="*" path="*" 这里设成*,如果页面里引入了CSS文件(JS文件应该也一样),

    return PageParser.GetCompiledPageInstance(url, strFilePath, context);就会出错,因为他无法处理CSS文件。

    这时应该怎么做?


    2010年4月10日 23:50

答案

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

    这里有一个HttpHandler的实现,发现有一点问题。

      public class RewriterFactoryHandler:HttpHandlerFactory

    {

     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);
            }

    }

     我的配置文件

    <add verb="*" path="*" 这里设成*,如果页面里引入了CSS文件(JS文件应该也一样),

    return PageParser.GetCompiledPageInstance(url, strFilePath, context);就会出错,因为他无法处理CSS文件。

    这时应该怎么做?



    1. 你可以在你的gethandler中,过滤掉你不想要重写的文件。

    2. 把你的css和js,或者image设置成虚拟目录,remove掉isapi中请求。(IIS不会处理这些文件的,除非你设置过)。

    3. 配置文件中的path修改成你需要的文件,e.g *.aspx等。

    • 已标记为答案 KeFang Chen 2010年4月16日 5:55
    • 取消答案标记 KeFang Chen 2010年4月16日 5:55
    • 取消答案标记 KeFang Chen 2010年4月16日 5:55
    • 已标记为答案 male110 2010年4月21日 7:03
    2010年4月12日 2:58

全部回复

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

    这里有一个HttpHandler的实现,发现有一点问题。

      public class RewriterFactoryHandler:HttpHandlerFactory

    {

     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);
            }

    }

     我的配置文件

    <add verb="*" path="*" 这里设成*,如果页面里引入了CSS文件(JS文件应该也一样),

    return PageParser.GetCompiledPageInstance(url, strFilePath, context);就会出错,因为他无法处理CSS文件。

    这时应该怎么做?



    1. 你可以在你的gethandler中,过滤掉你不想要重写的文件。

    2. 把你的css和js,或者image设置成虚拟目录,remove掉isapi中请求。(IIS不会处理这些文件的,除非你设置过)。

    3. 配置文件中的path修改成你需要的文件,e.g *.aspx等。

    • 已标记为答案 KeFang Chen 2010年4月16日 5:55
    • 取消答案标记 KeFang Chen 2010年4月16日 5:55
    • 取消答案标记 KeFang Chen 2010年4月16日 5:55
    • 已标记为答案 male110 2010年4月21日 7:03
    2010年4月12日 2:58
  • 1,过滤掉不想重写的,但是这个GetHandler一定要返回一个IHttpHandler,对于不满足规则的

    return PageParser.GetCompiledPageInstance(url, strFilePath, context);

    这句就会出错如果是CSS文件.

    3. 配置文件中的path修改成你需要的文件,e.g *.aspx等。

    这个也不会,因为我一定要设成*要处理~/abc/的重写

    2,太麻烦了,最好不要在IIS里设置,能在程序里处理一下.


    2010年4月12日 3:42
  • 1,过滤掉不想重写的,但是这个GetHandler一定要返回一个IHttpHandler,对于不满足规则的

    return PageParser.GetCompiledPageInstance(url, strFilePath, context);

    这句就会出错如果是CSS文件.

    3. 配置文件中的path修改成你需要的文件,e.g *.aspx等。

    这个也不会,因为我一定要设成*要处理~/abc/的重写

    2,太麻烦了,最好不要在IIS里设置,能在程序里处理一下.



    1. 返回null看看是什么情况吧。
    2010年4月12日 5:24
  • XML解析错误:未找到元素 位置:http://localhost:3891/*.aspx 行:1,列:1: 不行NULL肯定不行。
    2010年4月12日 12:12
  • 你好,

    *表示任何文件吗?

    你这里只是对请求aspx的文件做重写吧,那应该是path=*.aspx吧.

    对于其它的如css、js文件没必要做重写。


    Microsoft Online Community Support
    2010年4月13日 2:26
  • 因为我一定要设成*要处理~/abc/的重写

    比如把~/abc/重写到default.aspx?user=abc

    这时一定要设成*吧.但设成*对于一些没办法处理文件比如css怎么处理.

    当然用HttpModule是完全可以实现的.

    我就是想问问HttpHandler怎么处理?


    2010年4月13日 2:30
  • GetCompiledPageInstance

    应该没有实现css js文件的handle,所以报错了。

     

    我觉得你只能按照我说的第2方法来做,经过2的设置,css和js的文件就会跳过url重写,直接由IIS返回了。不需要路由到IISAPI去执行handle。

    这样就不会出错了。

    2010年4月13日 2:59
  • 可这样不是要设置IIS么,我们一般是买空间,不方便设置IIS.

     


    2010年4月13日 3:07
  • 好奇怪呀,我在家笔记本就会出氏.

    在公司就没出错,但设断点,也会有异常

    没有为扩展名“.css”注册的生成提供程序。可以在 machine.config 或 web.config 中的 <compilation><buildProviders> 节注册一个。请确保所注册的提供程序具有包含值“Web”或“All”的 BuildProviderAppliesToAttribute 属性。

    不设页面也正常打开了.

    虽然页面上什么内容也没有. 就一句Response.Write("<b>xxxx</b><br/>");

    为什么?


    2010年4月13日 3:25