ASP.NET中的HTTP模块和处理程序(上)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASP.NET中的HTTP模块和处理程序(上)相关的知识,希望对你有一定的参考价值。

参考技术A

   介绍       在Internet时代的开端 客户端的需求非常有限文件就可以满足他们的需求 但是 随着时间的流逝 客户端需求的扩充超越文件或静态文件所包含的功能       开发者需要扩充或扩展Web服务器的功能 Web服务器厂商设计了不同的解决方案 但是都遵循同一个主题 向Web服务器插入某些组件 所有的Web服务器补充技术都允许开发者建立并插入组件以增强Web服务器的功能 微软公司提出了ISAPI(Internet服务器API) 网景公司提出了NSAPI(网景服务器API)等等       ISAPI是一种重要的技术 它允许我们增强与ISAPI兼容的Web服务器(IIS就是一种与ISAPI兼容的Web服务器)的能力 我们使用下面的组件达到这个目的        · ISAPI扩展        · ISAPI过滤器      ISAPI扩展是使用Win 动态链接库来实现的 你可以把ISAPI扩展看作是一个普通的应用程序 ISAPI扩展的处理目标是请求 这意味着你必须调用它们才能激活它们 你可以认为ISAPI过滤器仅仅就是一个过滤器而已 客户端每次向服务器发出请求的时候 请求要经过过滤器 客户端不需要在请求中指定过滤器 只需要简单地把请求发送给Web服务器 接着Web服务器把请求传递给相关的过滤器 接下来过滤器可能修改请求 执行某些登录操作等等       由于这些组件的复杂性 实现它们非常困难 开发者不得不使用C/C++来开发这些组件 但是对于很多人来说 使用C/C++进行开发简直就是痛苦的代名词       那么ASP NET提供什么东西来实现这些功能呢?ASP NET提供的是HttpHandler(HTTP处理程序)和HttpModule(HTTP模块)       在深入了解这些组件的详细信息之前 了解一下请求经过HTTP模块和HTTP处理程序的时候的处理流程是有价值的        建立示例应用程序        我建立了下面一些的C#项目以演示应用程序的不同组件        · NewHandler (HTTP处理程序)        · Webapp (演示HTTP处理程序)        · SecurityModules (HTTP模块)        · Webapp (演示HTTP模块)        这些应用程序的安装步骤        · 解开attached zip文件中的所以代码        · 建立两个虚拟目录webapp和webapp 把这两个目录指向Webapp和Webapp 应用程序的实际物理目录        · 把NewHandler项目中的Newhandler dll文件复制到webapp应用程序的bin目录        · 把SecurityModules项目中的SecurityModules dll文件复制到webapp 应用程序的bin目录中

   ASP NET请求的处理过程       ASP NET请求处理过程是基于管道模型的 在模型中ASP NET把请求传递给管道中的所有模块 每个模块都接收请求并有完全控制权限 模块可以用任何自认为适合的方式来处理请求 一旦请求经过了所有HTTP模块 就最终被HTTP处理程序处理 HTTP处理程序对请求进行一些处理 并且结果将再次经过管道中的HTTP模块   

  请注意在请求的处理过程中 只能调用一个HTTP处理程序 然而可以调用多个HTTP模块        Http处理程序       HTTP处理程序是实现了System Web IHttpHandler接口的 NET组件 任何实现了IHttpHandler接口的类都可以用于处理输入的HTTP请求 HTTP处理程序与ISAPI扩展有些类似 HTTP处理程序和ISAPI扩展的差别在于在URL中可以使用HTTP处理程序的文件名称直接调用它们 与ISAPI扩展类似        HTTP处理程序实现了下列方法       方法名称描述ProcessRequest 这个方法实际上是处理程序的核心 我们调用这个方法来处理请求 IsReusable 我们调用这个属性来决定处理程序的实例是否可以用于处理相同其它类型的请求 HTTP处理程序可以返回true或false来表明它们是否可以重复使用       你可以使用nfig或者nfig文件把这些类映射到请求上 映射完成以后 当接收到相应请求的时候ASP NET会实例化处理程序 我们将解释如何在nfig和/或nfig文件中定义所有这些细节信息       ASP NET还通过IHttpHandlerFactory接口支持处理程序的扩展 ASP NET提供了把请求路由到实现IHttpHandlerFactory接口的类的对象上的能力 此外 ASP NET还利用了Factory设计模式 这种模式为建立一组相关对象而不提供具体类的功能提供了接口 简单的说 你可以把用于建立依赖传递进来的参数建立的处理程序对象的类看作是factory(工厂) 我们不用指定需要实例化的特定的处理程序 处理程序工厂处理这种事务 这样做的优点在于如果未来实现IHttpHandler接口的对象的实现方法发生了改变 只要接口仍然相同 客户端就不会受到影响         下面是IHttpHandlerFactory接口中的方法列表        方法名称描述GetHandler 这个方法负责建立适当的处理程序并把它的指针返回到调用代码(ASP NET运行时) 这个方法返回的处理程序对象应该实现了IHttpHandler接口 ReleaseHandler 这个方法负责在请求处理完成后释放处理程序 Factory 实现决定了它的操作 Factory 实现可以是实际摧毁实例 也可以把它放入缓冲池供以后使用        在配置文件中注册HTTP处理程序和HTTP处理程序工厂        ASP NET在下面的配置文件中维护自己的配置信息        · nfig        · nfig        nfig文件包含应用于计算机上安装的所有Web应用程序的配置设置信息       nfig文件对于每个Web应用程序来说是特定的 每个Web应用程序都有自己的nfig文件 Web应用程序的任何子目录也可能包含自己的nfig文件 这使得它们能够覆盖父目录的设置信息    为了给我们的Web应用程序添加HTTP处理程序 你可以使用<Handlers>和<add>节点 实际上 处理程序都带有<add>节点 列举在<Handlers>和</Handlers>节点之间 下面是添加HTTP处理程序的一个普通的例子      <Handlers>    <add verb= supported verbs path= path type= namespace classname assemblyname />   <Handlers>        在上面的XML中       · Verb属性指定了处理程序支持的HTTP动作 如果某个处理程序支持所有的HTTP动作 请使用 * 否则使用逗号分隔的列表列出支持的动作 因此如果你的处理程序只支持HTTP GET和POST 那么verb属性就应该是 GET POST       · Path属性指定了需要调用处理程序的路径和文件名(可以包含通配符) 例如 如果你希望自己的处理程序只有在test xyz文件被请求的时候才被调用 那么path属性就包含 test xyz 如果你希望含有 xyz后缀的所有文件都调用处理程序 path属性应该包含 * xyz       · Type属性用名字空间 类名称和部件名称的组合形式指定处理程序或处理程序工厂的实际类型 ASP NET运行时首先搜索应用程序的bin目录中的部件DLL 接着在全局部件缓冲(GAC)中搜索

   ASP NET运行时对HTTP处理程序的使用方式        无论你是否相信 ASP NET都使用HTTP请求实现了大量的自己的功能 ASP NET使用处理程序来处理 aspx a *** x soap和其它ASP NET文件         下面是nfig文件中的一个片段       <Handlers>    <add verb= * path= trace axd type= System Web Handlers TraceHandler />    <add verb= * path= * aspx type= System Web UI PageHandlerFactory />    <add verb= * path= * ashx type= System Web UI SimpleHandlerFactory />    <add verb= * path= nfig type= System Web HttpForbiddenHandler />    <add verb= GET HEAD path= * type= System Web StaticFileHandler />           </Handlers>      在上面的配置信息中你可以看到对 aspx文件的所有请求都由System Web UI PageHandlerFactory类来处理 与此类似 nfig文件和其它文件(它们不能被客户端直接访问)的所有请求都由System Web HttpForbiddenHandler类处理 你可能已经猜到 当访问这些文件的时候 该类简单地给客户端返回一个错误信息       执行HTTP处理程序       现在你将看到如何实现一个HTTP处理程序 那么我们的新处理程序要做什么任务呢?前面我提到 处理程序大多数用于给Web服务器添加新功能 因此 我将建立一个处理程序来处理新的文件类型——扩展名为 seconds的文件 我们建立了这个处理程序并在我们的Web应用程序的nfig文件中注册之后 所有对 seconds文件的请求都将由这个新处理程序来处理       你可能正在考虑这个处理程序的使用方法 如果你希望引入一种新的服务器脚本语言或动态服务器文件(例如asp aspx)该怎么办呢?你可以为它编写一个自己的处理程序 类似地 如果你希望在IIS上运行Java小程序 JSP和其它一些服务器端Java组件应该怎么办呢?一种方法是安装某些ISAPI扩展(例如Allaire或Macromedia Jrun) 你也可以编写自己的HTTP处理程序 尽管这对于第三方厂商(例如Allaire和Macromedia)来说是很复杂的事务 但是它却是个很有吸引力的选择 因为它们的HTTP处理能够能够访问ASP NET运行时暴露的所有新功能         实现我们的HTTP处理程序包含以下步骤         编写一个实现IHttpHandler接口的类         在nfig或nfig文件中注册这个处理程序        在Internet服务管理器中把文件扩展( seconds)映射到ASP NET ISAPI扩展DLL(aspnet_isapi dll)上        第一步       在Visual Studio NET中建立一个新的C#类库项目 并把它命名为 MyHandler Visual Studio NET将自动地给项目添加一个叫做 Class cs 的类 把它改名为 NewHandler 在代码窗口中打开这个类 并把类的名称和构造函数的名称改成 NewHandler        下面是NewHandler类的代码      using System;   using System Web;      namespace MyHandler       public class NewHandler : IHttpHandler         public NewHandler()           // TODO: 此处添加构造逻辑             #region Implementation of IHttpHandler     public void ProcessRequest(System Web HttpContext context)           HttpResponse objResponse = context Response ;      objResponse Write( <><body><h >Hello Seconds Reader ) ;      objResponse Write( </body></> ) ;             public bool IsReusable           get             return true;                #endregion             你在ProcessRequest方法中可以看到 该HTTP处理程序通过System Web HttpContext对象访问了所有作为参数传递给它的ASP NET内部对象 实现ProcessRequest方法只需要简单地从context对象中提取HttpResponse对象并把发送一些html给客户端 类似地 IsReusable返回true 表明这个处理程序可以被重复用作处理其它的HTTP请求        我们编译上面的代码并把它放到webapp虚拟目录的bin目录之中    第二步        在nfig文件中通过添加下面的文本来注册这个处理程序      <Handlers>    <add verb= * path= * seconds type= MyHandler NewHandler MyHandler />   </Handlers>    第三步       由于我们已经建立了用于处理新扩展文件的处理程序了 我们还需要把这个扩展名告诉IIS并把它映射到ASP NET 如果你不执行这个步骤而试图访问Hello seconds文件 IIS将简单地返回该文件而不是把它传递给ASP NET运行时 其结果是该HTTP处理程序不会被调用       运行Internet服务管理器 右键点击默认Web站点 选择属性 移动到Home目录选项页 并点击配置按钮 应用程序配置对话框弹出来了 点击添加按钮并在可执行字段输入aspnet_isapi dll文件路径 在扩展字段输入 seconds 其它字段不用处理 该对话框如下所示        

     点击确认按钮关闭应用程序配置和默认Web站点属性对话框   现在我们运行Internet Explorer并输入url 看到的页面如下

lishixinzhi/Article/program/net/201311/11664

ASP.NET MVC中的错误处理

ASP.NET MVC中的错误的错误处理跨越了两个主要领域:程序异常和路由异常的处理。前者是关于在控制器和视图中捕获错误的;而后者更多是有关重定向和HTTP错误的。

1、在WebConfig中把过滤器配置启动

    <customErrors mode="On">
    </customErrors>

控制器的代码报错时,会跳转到~/Views/Shared/Error.cshtml页面。mode="Off"页面不会跳转直接显示错误信息。

2、绑定异常过滤器(过滤范围是在controller的action方法中。)

    public class FilterConfig
    {
        //效果相当于每个控制器的方法都添加了这个特性
        //[HandleError(ExceptionType = typeof(NullReferenceException), View = "error")]
        //public ActionResult Index()
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }
    }

3、处理路由异常

    <customErrors mode="On">
      <error statusCode="404" redirect="~/Home/Index"/>
    </customErrors>

4、使用HTTP模块的全局错误处理

    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }

        protected void Application_Error(object sender,EventArgs e)
        {
            var exception = Server.GetLastError();
            if (exception == null)
                return;
            Server.ClearError();
        }
    }

 

以上是关于ASP.NET中的HTTP模块和处理程序(上)的主要内容,如果未能解决你的问题,请参考以下文章

模块和程序处理

将处理程序添加到 ASP.NET Core 中的默认 http 客户端 [重复]

ASP.NET MVC5请求管道和生命周期

ASP.NET MVC5请求管道和生命周期

Asp.Net MVC (RC 5) 中的 404 Http 错误处理程序

asp.net发布到IIS中出现错误:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”