1. 程式人生 > >ASP.NET請求過程-Handler

ASP.NET請求過程-Handler

string fault erro 技術 hosting soft close 都是 sta

什麽事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>
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

技術分享圖片

ASP.NET請求過程-Handler