zoukankan      html  css  js  c++  java
  • 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:WindowsMicrosoft.NETFramework64v4.0.30319Configweb.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>
    View Code

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

    自定义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"));
        }
    }
    View Code

    修改配置文件

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

     

    Handler获取   HttpContext.Handler.GetType();

  • 相关阅读:
    Innodb中自增长值的列
    LINUX-vmstat命令讲解
    find命令总结
    特殊权限chattr的用法
    openstack的最简单安装
    解决新电脑的系统安装问题:针对BIOS的UEFI模式
    Linux中安装字体
    云主机和vps的区别
    install-scp
    常见typedef 用法
  • 原文地址:https://www.cnblogs.com/wudequn/p/7923716.html
Copyright © 2011-2022 走看看