zoukankan      html  css  js  c++  java
  • URL重写及ASP.NET路由、Http处理模块、程序等

    这段时间在学习ASP.NET路由、HTTP处理等内容,了解了一些,但又未完全弄懂,似是而非,不管如何,作一总结,供日后借鉴和修改。


    一、IIS6和IIS7经典模式和集成模式

    在IIS6及IIS7经典模式下,对ASP.NET的处理部分是独立出来的,靠aspnet_isapi.dll来处理完成。一个请求从浏览器发到IIS,IIS先判断请求的类型,如果是ASP.NET部分,就转发给aspnet_isapi.dll来处理,处理完了再返回给IIS,再由IIS返回到浏览器。


    而在IIS7集成模式中,不管什么资源,什么类型,都在同一个管道中完成。



    参考文章:

    深入解读IIS 7中应用程序池的管道模式
    http://tech.techweb.com.cn/redirect.php?fid=2&tid=496369&goto=nextnewset

    Asp.Net生命周期和Http管道技术

    http://www.cnblogs.com/refactor/archive/2012/07/06/2568742.html


    也就是说,我写一个HTTP处理模块(module)、程序(handler),如果在IIS6和经典模式下,对静态页面之类的资源,是不起作用的,但IIS7的集成模式下,就可以。另外,如果我想写一个HTTP  Handler 来实现什么路由:

    http://www.test.com/a.action/id/1 ==》http://www.test.com/a.aspx?id=1,则

    在IIS6下,需要映射后缀名为.action的文件到aspnet_isapi.dll

    在IIS7经典模式下,需要在web.config中注册和声明

    在IIS7集成模式下,最简单,仅需少许配置

    app_code/myhandler.cs

    /// <summary>
    /// handler 的摘要说明
    /// </summary>
    public class MyHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.Write("<H1>Hello, I'm an HTTP handler</H1>");
            //HttpRequest request = context.Request;
            //context.Response.Redirect("/default2.aspx");
        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }

    IIS7经典模式下的web.config

    <!--
      有关如何配置 ASP.NET 应用程序的详细信息,请访问
      http://go.microsoft.com/fwlink/?LinkId=169433
      -->
    <configuration>
      <system.web>
        <httpHandlers>
          <add verb="*" path="*.action" 
            type="MyHandler" />
        </httpHandlers>
      </system.web>
      <system.webServer>
          <handlers>
            <add name="MyHandler" verb="*" path="*.action" 
              modules="IsapiModule" 
              scriptProcessor="C:WindowsMicrosoft.NETFrameworkv4.0.30319aspnet_isapi.dll"
              resourceType="Unspecified" />
          </handlers>
      </system.webServer>
    </configuration>
    

    IIS7集成模式下

    <?xml version="1.0"?>
    <!--
      有关如何配置 ASP.NET 应用程序的详细信息,请访问
      http://go.microsoft.com/fwlink/?LinkId=169433
      -->
    <configuration>
      <system.webServer>
          <handlers>
              <add name="SampleHandler" verb="*"
                path="*.action"
                type="MyHandler"
                resourceType="Unspecified" />
          </handlers>
      </system.webServer>
    </configuration>

    参考文章:

    HTTP 处理程序和 HTTP 模块概述

    http://msdn.microsoft.com/zh-cn/library/bb398986(v=vs.100).aspx


    二、ASP.NET路由

    路由不是MVC特有的功能,WEB FORM程序也完全可以采用。问题是,IIS6和IIS7经典模式下,因为上述原因,路径中一定要加后缀名,比如http://www.test.com/a.aspx/id/1,

    否则不起作用,URL的优美、友好性不免打上折扣。


    还有一个问题,就是采用路由之后,如何读取参数。

    习惯了传统URL下,QueryString的方式。但采用路由,是不能像常见的URL重写那样,将参数附在目标页面后面比如

            routes.MapPageRoute("productinfo",
                "pid.ashx/{id}",
                "~/handler.ashx?pid=");

    我曾经以为可以将这个{id},附在目标地址后面,写成这个样子,hanler.ashx?pid=$1,结果没门。

    参数是怎么提取的呢?是在目标页面里,用 Page.RouteData.Values["..."]的方式提取。并且这个页面要是aspx页面,ashx还不行。

    ASP.NET 路由

    http://msdn.microsoft.com/zh-cn/library/cc668201(v=vs.100).aspx


    三、URL重写过时了吗

    又有路由,又有自定义的HTTP处理模块、程序,还要URL重写干嘛?微软有一个给IIS7的重写模块外,其他都是杂牌军,总有点怪怪的感觉。

    (详见拙作http://blog.csdn.net/leftfist/article/details/9283141

    但是,对于IIS6和IIS7经典模式来讲,URL重写可以处理静态资源类地址,证明在IIS处理过程中,先于ASP.NET一步,我相信它的性能要比路由和自定义HTTP处理要高。并且各种正则表达式,复杂是复杂了一点,但毕竟能实现得相当好。






    这些不同WEB服务器下的特点,是我们想实现优美、友好的URL所要考虑的。





  • 相关阅读:
    CControlLayer
    CBiontCache
    CHero
    CWidgetMgr---cpp
    CWidgetMgr---H
    CXAnimation类
    CXAnimation.h动画类
    CXCommon.h工具类
    【leetcode】441. Arranging Coins
    【linux基础】关于ARM板子使用O3编译选项优化
  • 原文地址:https://www.cnblogs.com/leftfist/p/4258005.html
Copyright © 2011-2022 走看看