处理文件
1 IIS根据文件的后缀名处理html或asp
2 服获取后缀名以后,寻找处理的程序,找不到或没有受到服务器端的保护 直接返还文件。(受保护的例子是 App_Code中的),
3 处理后缀名程序,称为 ISAPI 应用程序,代理作用,映射请求页面和后缀名相对的处理程序。
卸载运行在同一进程的应用程序,请求分放在相互隔离的应用程序域中( AppDomain)。
HTTP.SYS 监听外部的 HTTP请求
在操作系统启动,IIS在HTTP.SYS中注册虚拟路径。
HttpRuntime类是Asp.Net的主要入口, 有ProcessRequest方法,HttpWorkerRequest 类为参数。
HttpRuntime 类包含单个 Http请求信息
责任链模式的变种(实现方式)
责任链模式:多个对象组成链子传递该请求,直到有对象处理它为止。
优点 1降低了发送者和接收者耦合。2 把多个条件分散到各个处理类中。
缺点,如: 1 未在找到正确,所有的条件判定都要执行 2可能某个请求不被处理。
管道模型:多个对象组成链子传递该请求。
优点:流程式(有序)+可拆卸(配置)
缺点:每次请求都必须从链头开始遍历
管道由托管模块(Managed Modules)和处理程序(Handlers)组成且由管道处理 Http请求。这就是asp管道模型
HttpContext(请求上下文):HttpRequest、HttpResponse、HttpSessionState
(WebForm)
ii7前:IIS请求处理管道和ASP.NET管道
ii7后,管道流程执行,例如BeginRequest、AuthenticateRequest、…、EndRequest。 19个事件
优点:自定义HttpModule或者HttpHandler,集成到IIS上
MVC
MVC具体细节
HttpApplication与HttpModule
HTTP请求由ASP.NET运行时接管之后,HttpRuntime会利用HttpApplicationFactory创建或从HttpApplication对象池(.NET中类似的机制有线程池和字符串拘留池)中取出一个HttpApplication对象,同时ASP.NET会根据配置文件来初始化注册的HttpModule,HttpModule在初始化时会订阅HttpApplication中的事件来实现对HTTP请求的处理。
简短个人总结:HttpApplication被创建或对象池取出。配置文件注册HttpModule,订阅事件实现请求处理。
HttpApplication继承了IHttpHandler,是跟WebForm的Page是一样的
Route
路由系统从请求URL中获取controller和action的名称以及其它请求数据。
UrlRoutingModule根据URL和RouteTable路由模板匹配返回第一个匹配的路由对象Route,获取路由数据对象RouteData,再获取IRouteHandler最终得到IHttpHandler(实现)
HttpHandler
请求最终进入HttpHanler中处理,一次被一个HttpHandler处理。至少经过一个HttpModule的处理。
Controller
IHttpHandler在ProcessRequest方法中对当前请求处理,通过ControllerBuilder得到IControllerFactory然后通过反射的方式获取Controller的类型。
Action
ControllerBase是Controller的基类,该类型的Execute方法中通过IActionInvoker的InvokeAction方法来执行对Action的调用。在Action执行前会进行模型绑定和模型认证操作。
Filters
MVC5中常用过滤器有5个:IAuthenticationFilter、IAuthorizationFilter、IActionFilter、IResultFilter、IExceptionFilter。
过滤器最终被封装为Filter对象,该对象中FilterScope类的Scope和int的Order决定过滤器执行顺序,具体规则如下:
Order和Scope的数值越小,过滤器的执行优先级越高;
Order比Scope具有更高的优先级,在Order属性值相同时FilterScope才会被考虑
ActionResult
Action执行完毕返回ActionResult为处理结果,不是ActionResult,转换为ActionResult。
有独立的SDK,RunTime
有自己的Kestrel Server,对外部提供服务。需要反向代理服务器,IIS是其一,其他平台有其他的方式.
知识点:IIS 通过 HTTP 调用.NET Core 程序。部署在IIS中,不用手动启动 ANET Core 程序,IIS新增 AspNetCoreModule 模块,负责 ASP.NET Core 程序的启动与停止,并监听 状态,崩溃时重新启动。
Kestrel 中间件。
appsettinggs.json 是配置文件。
Hostting(宿主)
必须创建Host启动Core,通过宿主生成Http的上下文,环境等。整个请求在宿主内。
WeHost通过静态本创建出。“CreateDefaultBuilder”做简单的配置
- 注册 中间件,指定使用的 Server(HTTP服务器)。
- 将当前项目的根目录作为 ContentRoot 的目录。
- 读取配置文件,开发环境下的 UserSecrets 以及环境变量和命令行参数。
- 读取配置文件中的 Logging 节点,对日志系统进行配置。
- 添加 IISIntegration 中间件。
- 设置开发环境下, ServiceProvider 的 ValidateScopes 为 true,避免直接在 Configure 方法中获取 Scope 实例。
简单总结:“CreateDefaultBuilder”做的配置
1 指定服务器2设置根目录 3 读取配置文件配置 4 日志系统配置 5 添加中间件。 6 避免直接获取scope
接着指定Startup
最终使用Build
创建WebHost。紧接着使用Run
将程序跑起来。
Http Server 是HTTP服务器,监听HTTP,接收 FeatureCollection 的原始请求,包装成 HttpContext
IApplicationBuilder 建应请求管道,也就是生成 RequestDelegate
WebHost的启动
1 创建并配置 IApplicationBuilder 2 启动server 启动hostedservice
Middleware(中间件),管道模型的构成
请求管道,是对 HttpContext 的操作,即对 Request 的处理,生成 Reponse。因此,定义了 RequestDelegate 委托,来表示请求管道的步骤,它有如下定义:public delegate Task RequestDelegate(HttpContext context);
注册是过 Func
类型的委托实现的。它接收RequestDelegate 的参数,并返回 RequestDelegate ,前一个中间件的输出成为下一个中间件的输入,串联起来形成了完整的管道。
它有一个内部的 Func
1. UseUse
是注册中间件,将中间件保存到其内部属性 _components 中。
2. Build
创建RequestDelegate 类型的委托,Http Server 通过该委托完成请求的响应
3. Run
注册最后一个中间件
4. New
“克隆”新的 ApplicationBuilder 对象,对自身属性的修改,不影响创建者,通过 CopyOnWriteDictionary 实现
Core的管道就是Middleware来做的,每个都有前置,后置的处理步骤,中间可以调用其他Middleware。也可以并行走向。
总结
WebForm,MVC的ISAPI以插件形式存在IIS,Core跨平台,IIS只是反向代理,HTTP请求带Core的程序,运行Core。
HTTP请求,在彼此的AppDomain
中创建HttpContext
,。
WebFrom走Page
的IHTTPHandler
与Module,走 Pipeline
。
MVC是Global.asax
继承HttpApplication
,HttpApplication
又继承IHTTPHandler
, 走 Pipeline
。
Core,采用Middleware
(中间件)的形式。走Pipeline
。
WebHost的创建
public class Program{
public static void Main(string[] args){
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup();
}
自定义HttpModule 1 实现IHttpModule,2 webconfig注册,里面给HttpApplication添加动作,
HttpModule是每次请求都执行.
HttpApplication有17个事件处理不同的请求,BeginRequest和EndRequest是做扩展的
PostMapRequestHandler创建处理器对象,写的MVC,Webform,用它实际执行。
HttpContext.ApplicationInstance.GetType().GetEvents() 可以获取所有事件
在PreRequstHandlerExecute(准备执行处理程序),PostRequestHandlerExecute(已经执行了处理程序),ReleaseRequestState(释放请求的状态),PostReleaseRequestState(已经释放了请求的状态)。
HttpContext.ApplicationInstance.GetType().Modules.AllKeys 获取全部Module
三.HttpModule 能干什么
1.权限认证:每个请求都经过Module,所以做权限认证很好。
2.URL转发:
新建BaseModule在webcofing注册
重写BeginRequest,获取请求地址,使用context.Request.Url.AbsoluteUri
重定向,使用context.Response.Write
MVC就是Module的扩展,,增加UrlRoutingModule,把请求做映射处理,指向MvcHandler。(和上面实现类似)
伪静态也可以这样做,在IIS给后缀指定处理程序asp.net_isapi,请求进到HttpApplication,扩展Module,建立跳转规则。
3.反爬虫:
请求都要经过Module,记录每个IP,太频繁,访问验证码页面。
参考文献:
学习篇:asp.net mvc 管道模型:https://blog.csdn.net/u010690818/article/details/78328070
MVC5管道处理模型:https://blog.csdn.net/m0_37591671/article/details/82970442
Asp.net管道模型(管线模型):http://www.cnblogs.com/kuyusea/p/4638395.html
管道处理模型一!:https://blog.csdn.net/cainong2005/article/details/80114085
管道模型!:http://www.cnblogs.com/xuhuale/p/10030878.html
管道模型 2: https://blog.csdn.net/qq_26545305/article/details/70214912
管道模型3 :http://www.cnblogs.com/fsjohnhuang/articles/2327443.html