ASP.NET请求过程-Handler

什么事Handler

asp.net程序所有的请求都是handler处理的。以前的webform我们访问的地址是xxxxx.aspx地址,其实他也会到一个handler(我们写的业务代码都在handler里面)。现在的 asp.net mvc,我们访问的页面后面 没有aspx后缀了,但是他也是会到handler处理的(但是我们更加局限了,我们的业务代码不是在handler里面)。总的来说 asp.net的请求都是handler处理的。

IIS服务器中  ISAPI服务分配请求的时候根据后缀名分配的,而且大部分是分配给aspnet_isapi.dll处理的(但是mvc中就没有后缀了,怎么匹配?   框架自动加了axd后缀的  配置.axd的规则 )。对于这么多的类型文件他又是怎么处理的呢?  这个在.net   框架里面有配置的   具体路径C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config

<httpHandlers>
    <add path="eurl.axd" verb="*" type="System.Web.HttpNotFoundHandler" validate="True" />
    <add path="trace.axd" verb="*" type="System.Web.Handlers.TraceHandler" validate="True" />
    <add path="WebResource.axd" verb="GET" type="System.Web.Handlers.AssemblyResourceLoader" validate="True" />
    <add verb="*" path="*_AppService.axd" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="False" />
    <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="False"/>
    <add path="*.axd" verb="*" type="System.Web.HttpNotFoundHandler" validate="True" />
    <add path="*.aspx" verb="*" type="System.Web.UI.PageHandlerFactory" validate="True" />
    <add path="*.ashx" verb="*" type="System.Web.UI.SimpleHandlerFactory" validate="True" />
    <add path="*.asmx" verb="*" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="False" />
    <add path="*.rem" verb="*" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" validate="False" />
    <add path="*.soap" verb="*" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" validate="False" />
    <add path="*.asax" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.ascx" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.master" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.skin" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.browser" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.sitemap" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.dll.config" verb="GET,HEAD" type="System.Web.StaticFileHandler" validate="True" />
    <add path="*.exe.config" verb="GET,HEAD" type="System.Web.StaticFileHandler" validate="True" />
    <add path="*.config" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.cs" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.csproj" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.vb" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.vbproj" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.webinfo" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.licx" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.resx" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.resources" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.mdb" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.vjsproj" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.java" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.jsl" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.ldb" verb="*" type="System.Web.HttpForbiddenHandler"  validate="True" />
    <add path="*.ad" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.dd" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.ldd" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.sd" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.cd" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.adprototype" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.lddprototype" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.sdm" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.sdmDocument" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.mdf" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.ldf" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.exclude" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.refresh" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
    <add path="*.svc" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="False"/>
    <add path="*.rules" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
    <add path="*.xoml" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="False"/>
    <add path="*.xamlx" verb="*" type="System.Xaml.Hosting.XamlHttpHandlerFactory, System.Xaml.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="False"/>
    <add path="*.aspq" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
    <add path="*.cshtm" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
    <add path="*.cshtml" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
    <add path="*.vbhtm" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
    <add path="*.vbhtml" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
    <add path="*" verb="GET,HEAD,POST" type="System.Web.DefaultHttpHandler" validate="True" />
    <add path="*" verb="*" type="System.Web.HttpMethodNotAllowedHandler" validate="True" />
</httpHandlers>

<httpModules>
    <add name="OutputCache" type="System.Web.Caching.OutputCacheModule" />
    <add name="Session" type="System.Web.SessionState.SessionStateModule" />
    <add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule" />
    <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" />
    <add name="PassportAuthentication" type="System.Web.Security.PassportAuthenticationModule" />
    <add name="RoleManager" type="System.Web.Security.RoleManagerModule" />
    <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" />
    <add name="FileAuthorization" type="System.Web.Security.FileAuthorizationModule" />
    <add name="AnonymousIdentification" type="System.Web.Security.AnonymousIdentificationModule" />
    <add name="Profile" type="System.Web.Profile.ProfileModule" />
    <add name="ErrorHandlerModule" type="System.Web.Mobile.ErrorHandlerModule, System.Web.Mobile, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    <add name="ServiceModel" type="System.ServiceModel.Activation.HttpModule, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />
    <add name="ScriptModule-4.0" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</httpModules>

<add path="*.config" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />

.config 指的是config后缀的文件   verb指的是http请求的方式  verb="GET,HEAD",  type属性由“,”分隔成两部分,第一部分是实现了接口的命名空间+类名,第二部分是位于Bin目录下的编译过的程序集名称。

(这里对配置文件的加载过程,请求某一个地址,现在这个地址下面找 没有找到就一层一层的网上找,知道网站根目录,然后在是框架配置文件,然后再是服务器配置文件machine.config)

这样就把不同的后缀文件分配到不同的handler中处理。

Handler创建——IHttpHandler

定义:

//
// 摘要:
//     定义 ASP.NET 为使用自定义 HTTP 处理程序同步处理 HTTP Web 请求而实现的协定。
public interface IHttpHandler
{
    //
    // 摘要:
    //     获取一个值,该值指示其他请求是否可以使用 System.Web.IHttpHandler 实例。
    //
    // 返回结果:
    //     如果 System.Web.IHttpHandler 实例可再次使用,则为 true;否则为 false。
    bool IsReusable { get; }

    //
    // 摘要:
    //     通过实现 System.Web.IHttpHandler 接口的自定义 HttpHandler 启用 HTTP Web 请求的处理。
    //
    // 参数:
    //   context:
    //     System.Web.HttpContext 对象,它提供对用于为 HTTP 请求提供服务的内部服务器对象(如 Request、Response、Session
    //     和 Server)的引用。
    void ProcessRequest(HttpContext context);
}

自定义Handler

public class MyHandler : IHttpHandler
{
    public bool IsReusable
    {
        get
        {
            throw new true;
        }
    }

    public void ProcessRequest(HttpContext context)
    {
        context.Response.Write("    Handler:"+DateTime.Now.ToString("yyyy-MM-dd"));
    }
}

修改配置文件

<handlers>
  <add name="wyhandler" path="*.wyx" verb="*" type="MyHttpModuleDemo.App_Start.MyHandler,MyHttpModuleDemo"/>
</handlers>

运行程序后

发现不能访问,原因是  由于MVC中有路由的设置,把请求的路径进行路由匹配了,所以还要配置路由。(原来webform中没有加入路由,所以不用管       webform也可以加入路由的。)

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    //忽略Hand控制器下面的所有请求 不通过路由解析
    routes.IgnoreRoute("Hand/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

时间: 2024-10-08 13:27:52

ASP.NET请求过程-Handler的相关文章

ASP.NET请求过程-1

客户端发送请求到达服务器 输入域名->DNS解析->指定IP 服务器(如果网页直接输入IP地址则直接到服务器)->请求到达服务器->HTTP.SYS接受HTTP请求->转发给ISAPI(是一个内置服务,他是IIS服务器的一个组件),检查当前请求的后缀.(后缀的配置在 处理程序映射  服务里面)->根据后缀(asp.net mvc默认管道给他添加一个asd后缀)  管道通信给aspnet_isapi(注意这个是给sap.net用的   其他的还有php_isapi   j

ASP.NET 运行时详解 揭开请求过程神秘面纱

对于ASP.NET开发,排在前五的话题离不开请求生命周期.像什么Cache.身份认证.Role管理.Routing映射,微软到底在请求过程中干了哪些隐秘的事,现在是时候揭晓了.抛开乌云见晴天,接下来就一步步揭开请求管道神秘面纱. 上篇回顾 在介绍本篇内容之前,让我们先回顾下上一篇<ASP.NET运行时详解 集成模式和经典模式>的主要内容.在上一篇随笔中,我们提到ASP.NET运行时通过Application的InitInternal方法初始化运行管道.ASP.NET运行时提供了两种初始化管道模

【IIS】我所理解的IIS处理ASP.NET页面请求过程

众所周知,一个完整的动态网页的从请求到响应无非包括以下3个步骤: 1.浏览器客户端发出http请求. 2.IIS服务端接受请求. 3.处理请求并输出请求结果到浏览器客户端. 首先,简单的说说我所理解的IIS,它依赖于Windows服务World Wide Web Publish Service的,并依赖于进程w3wp.exe的.也就是说IIS的运行离不开工作进程w3wp.exe,同时每个IIS站点下的应用程序都是被用用程序池进行隔离,应用程序池即w3wp.exe的容器,通过池隔离的机制保证当某个

4.1ASP.NET Core请求过程「深入浅出ASP.NET Core系列」

希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. HTTP请求过程 这里展示整体的HTTP请求的过程,这里化繁为简,保留了主干流程: 从浏览器输入域名开始,这里忽略了建立TCP的3次握手,向服务器发起HTTPRequest请求,服务器接受到之后,会触发服务器对网站的动态解析,然后把生成的网页信息通过HTTPResponse返回给用户,内部包含HTML的Body,Head等信息,最后就是浏览器对这些HTML信息进行内部引擎渲染的过程了. ASP.NET Core

mvc请求过程总结-前篇

前言 最近在思考一个问题,我的学习方法一般主要是看博客来学习新东西,但是光看,基本也没总结过,所以经常会出现这样的问题,某个知识点我知道,但是就是不能很好的表达出来,很简单的东西往往都不知道如何简短精炼的阐述清楚.所以我想到应该每天抑或是经常性的总结近期学到的知识,这样既可以巩固知识又可以提高语言的组织能力. MVC的请求过程 有些比较细节的地方直接忽略了,我主要摸索它的大概轨迹 首先从客户端发出请求开始,iis接受请求,找到web应用程序运行的工作者进程,如果进程不存在,则创建的新的工作进程,

ASP.NET 未被授权访问所请求的资源。请考虑授予 ASP.NET 请求标识访问此资源的权限

开发了一个导入TXT文件的功能,执行过程中出错.提示:.....ASP.NET 未被授权访问所请求的资源.请考虑授予 ASP.NET 请求标识访问此资源的权限.ASP.NET 有一个在应用程序没有模拟时使用的基进程标识(通常,在 IIS 5 上为 {MACHINE}\ASPNET,在 IIS 6 上为网络服务).如果应用程序正在通过 <identity sonate="true"/> 模拟,则标识将为匿名用户(通常为IUSR_MACHINENAME)或经过身份验证的请求用户

JBossWeb/Tomcat 初始化连接器和处理 Http 请求过程

概述 JBossWeb 是JBoss 中的 Web 容器,他是对 Tomcat 的封装,本文以 Http 连接器为例,简单说明 JBossWeb/Tomcat 初始化连接器和处理 Http 请求过程 .本文内容提要: Connector 初始化开始过程 如何理解 max-connections JIoEndpoint 处理 Socket 请求 Connector 初始化开始过程 如下图所示: WebConnectorService 指的是 `org.jboss.as.web.WebConnect

【转】各版本IIS下ASP.net请求处理过程区别

原文地址:http://www.cnblogs.com/fsjohnhuang/articles/2332074.html ASP.NET是一个非常强大的构建Web应用的平台,它提供了极大的灵活性和能力以致于可以用它来构建所有类型的Web应用. 绝大多数的人只熟悉高层的框架如: WebForms 和 WebServices --这些都在ASP.NET层次结构在最高层. 这篇文章的资料收集整理自各种微软公开的文档,通过比较 IIS5.IIS6.IIS7 这三代 IIS 对请求的处理过程, 让我们熟

springMVC的请求过程

springMVC请求过程: 请求信息(包括用户相关信息)发送到DispatcherServlet,DispatcherServlet在这里做为前端控制器. DispatcherServlet查询处理器映射,处理器映射会根据请求携带的URL信息进行决策. 当选择了合适的控制器,DispatcherServlet会将请求发送给选中的控制器.在这里控制器会处理这些信息. 控制器在完成逻辑处理后,会产生一些信息,这些信息将被打包成模型(model),并指定一个接收视图名(逻辑名). Dispatche