首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ASP.NET Core管道深度剖析(3):管道是如何处理HTTP请求的?

为了让读者朋友们能够更加容易地理解管道处理HTTP请求的总体流程,我们根据真实管道的实现原理再造了一个“模拟管道”并在此管道上开发了一个发布图片的应用,这篇文章旨在为你讲述管道是如何处理HTTP请求的...ASP.NET Core请求处理管道由一个服务器和一组有序排列的中间件组合而成。...二、HttpContext 用来描述当前HTTP请求的上下文的HttpContext对于ASP .NET Core请求处理管道来说是一个非常重要的对象,我们不仅仅可以利用它获取当前请求的所有细节,还可以直接利用它完成对请求的响应...一个HttpApplication对象可以视为对一组中间件的封装,它对请求的处理工作最终交给这些中间件来完成,所有中间件对请求的处理最终可以转换成通过属性Application表示的RequestDelegate...HTTP请求一旦抵达,该方法会利用作为参数的HttpApplication对象创建一个上下文,并在此上下文中完成对请求的所有处理操作。

1.4K50

通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程:管道如何处理请求

如果想非常深刻地认识ASP.NET Core的请求处理管道,我觉得可以分两个步骤来进行:首先,我们可以在忽略具体细节的前提下搞清楚管道处理HTTP请求的总体流程;在对总体流程有了大致了解之后,我们再来补充这些刻意忽略的细节...、接收和响应 一、建立在“模拟管道”上的应用 再造的迷你管道不仅仅体现了真实管道中处理HTTP请求的流程,并且对于其中涉及的接口和类型,我们也基本上采用了相同的命名方式。...在通过这个模拟管道讲解HTTP请求的总体处理流程之前,我们先来看看如何在它基础上开发一个简单的应用。 我们在这个模拟管道上开发一个简单的应用来发布图片。...具体的应用场景是这样:我们将图片文件保存在服务器上的某个目录下,客户端可以通过发送HTTP请求并在请求地址上指定文件名的方式来获取目标图片。...实际上我们的应用不仅统一使用这个DefaultHttpContext对象来获取请求信息,同时还利用它来完成对请求的响应。

1.9K90
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程:管道是如何构建起来的?

    在《中篇》中,我们对管道的构成以及它对请求的处理流程进行了详细介绍,接下来我们需要了解的是这样一个管道是如何被构建起来的。...总的来说,管道由一个服务器和一个HttpApplication构成,前者负责监听请求并将接收的请求传递给给HttpApplication对象处理,后者则将请求处理任务委托给注册的中间件来完成。...,比如我们调用扩展方法UseStaticFiles来注册处理静态文件请求的中间件。...和它的构建者 ASP.NET Core管道是由作为应用宿主的WebHost对象创建出来的,后者是对所有实现了IWebHost接口的所有类型及其对象的统称。...如果我们没有显式指定监听地址,我们会使用默认的监听地址“http://localhost:5000”。

    4.3K50

    ASP.Net请求处理机制初步探索之旅 - Part 1 前奏

    但是,不管是ASP.Net WebForm还是ASP.Net MVC在请求处理机制上大部分都是相同的,只是在请求处理管道上的处理事件做了不同的操作,因此,本文标题不区分ASP.Net WebForm和ASP.Net...通过在内核模式运行Http.SYS,侦听器可以直接访问TCP/IP协议栈,但是又能够位于www服务之外,这样就不会受到应用程序中代码缺陷的影响,也不会因为应用程序崩溃而出现问题。...在IIS中,对于asp.net的请求一般是由aspnet_isapi.dll这个组件来进行.net运行时的加载和具体请求的处理。...以IIS 6.0为例,如果IIS判断它自己无法处理asp.net的请求,会由W3WP.exe所维护的工作进程来加载aspnet_isapi.dll。 ?...此篇我将其称为前奏,是因为它是在ASP.Net的核心处理部分之前,将HTTP请求一步一步地传递给了ISAPIRuntime对象,后面我们再继续探索ASP.Net的请求处理机制,今天就到此结束!

    1.6K20

    IIS 5.x与ASP.NET

    转自:http://www.cnblogs.com/artech/archive/2009/06/20/1507165.html 我们先来看看IIS 5.x是如何处理基于ASP.NET资源(比如.aspx...,并不执行任何用户代码,所以其本身不会受到Web应用、工作进程和IIS进程的影响; 内核模式下数据缓存:如果某个资源被频繁请求,HTTP.SYS会把响应的内容进行缓存,缓存的内容可以直接响应后续的请求。...由于这是基于内核模式的缓存,不存在内核模式和用户模式的切换,响应速度将得到极大的改进。 图2体现了IIS的结构和处理HTTP请求的流程。...因为ISAPI是基于Win32的非托管的API,并非一种面向应用的编程接口。通常我们希望的是诸如定义ASP.NET的HttpModule和HttpHandler一样,通过托管代码的方式来扩展IIS。...实际上,ASP.NET维护着一个HttpApplication对象池,HttpApplicationFactory从池中选取可用的HttpApplication用户处理HTTP请求,处理完毕后将其释放到对象池中

    2.8K20

    IIS执行原理

    高性能: 从用户发送http请求到系统返回响应结果的这一过程都是HTTP.SYS在内核模式下完成的。不需要在内核模式和用户模式下进行切换,这样就极大地节省了系统资源,提高了请求的响应速度。...此处请求的处理由IIS交给了asp.net的程序。 基于对上面的说明,可以把IIS的处理过程理解表示如下图: ?...在vs中写了一段C#代码(或者其它.net平台的语言,此处简单的用C#来说明) ,编译器会把代码转译成IL的中间语言程序。...区别 1、托管代码是一种中间语言,运行在CLR上;非托管代码被编译为机器码,运行在机器上。 2、托管代码独立于平台和语言,能更好的实现不同语言平台之间的兼容;非托管代码依赖于平台和语言。...而非托管代码,在编译的时候要保证兼容性,所以只能使用最通用的cpu指令(公共的CPU指令),所以我个人认为,.Net在执行的效率上更具有优势。 非托管编译运行过程 ?

    2.2K21

    WCF技术剖析之二:再谈IIS与ASP.NET管道

    IIS 5.x与ASP.NET 我们先来看看IIS 5.x是如何处理基于ASP.NET资源(比如.aspx,.asmx等)请求的,整个过程基本上可以通过图1体现。...,并不执行任何用户代码,所以其本身不会受到Web应用、工作进程和IIS进程的影响; 内核模式下数据缓存:如果某个资源被频繁请求,HTTP.SYS会把响应的内容进行缓存,缓存的内容可以直接响应后续的请求...由于这是基于内核模式的缓存,不存在内核模式和用户模式的切换,响应速度将得到极大的改进。 图2体现了IIS的结构和处理HTTP请求的流程。...因为ISAPI是基于Win32的非托管的API,并非一种面向应用的编程接口。通常我们希望的是诸如定义ASP.NET的HttpModule和HttpHandler一样,通过托管代码的方式来扩展IIS。...实际上,ASP.NET维护着一个HttpApplication对象池,HttpApplicationFactory从池中选取可用的HttpApplication用户处理HTTP请求,处理完毕后将其释放到对象池中

    1.6K110

    IIS的架构介绍

    如果某个步骤需要一个托管代码功能模块来处理如执行表单验证,内建的托管代码引擎就会创建一个应用程序域(AppDomain)来执行必要的处理,当请求顺序通过了所有功能组件的处理,HTTP请求的结果就会被返回到...1.4 IIS架构探秘 本节将详细介绍HTTP请求是如何被IIS的各个组件顺序处理的。...1.4.2 IIS的应用层实现   http.sys在内核态上处理完HTTP请求后,IIS就会把HTTP请求对应的HTTP上下文对象转到对应的应用程序进程中,由对应的w3wp.exe进程对请求进行处理。...1.4.3 一个HTTP请求在IIS上处理的完整流程 如图1.4所示,该图描述了一个HTTP请求的完整处理流程,通过该流程可以了解到IIS的各部分组件是如何协同工作的 ①用户在客户端浏览器输入一个URL...⑤WWW服务使用的配置信息来配置http.sys内核驱动的行为,如请求队列等。 ⑥当站点还没有工作进程为它服务时,WAS服务按照网站应用程序池配置启动一个w3wp.exe工作进程。

    2.1K10

    WCF技术剖析之二:再谈IIS与ASP.NET管道

    IIS 5.x与ASP.NET 我们先来看看IIS 5.x是如何处理基于ASP.NET资源(比如.aspx,.asmx等)请求的,整个过程基本上可以通过图1体现。...,并不执行任何用户代码,所以其本身不会受到Web应用、工作进程和IIS进程的影响; 内核模式下数据缓存:如果某个资源被频繁请求,HTTP.SYS会把响应的内容进行缓存,缓存的内容可以直接响应后续的请求...由于这是基于内核模式的缓存,不存在内核模式和用户模式的切换,响应速度将得到极大的改进。 图2体现了IIS的结构和处理HTTP请求的流程。...因为ISAPI是基于Win32的非托管的API,并非一种面向应用的编程接口。通常我们希望的是诸如定义ASP.NET的HttpModule和HttpHandler一样,通过托管代码的方式来扩展IIS。...实际上,ASP.NET维护着一个HttpApplication对象池,HttpApplicationFactory从池中选取可用的HttpApplication用户处理HTTP请求,处理完毕后将其释放到对象池中

    1.2K41

    Asp.net管道模型(管线模型)之一发不可收拾

    x和IIS7.x的区别 Asp.net管道模型                           参考:ASP.NET使用管道模型(PipleLines)处理HTTP请求 HttpRuntime的认识与加深理解...HTTP请求做任何处理,也就是说此时对于HTTP请求来讲,HttpModule是一个HTTP请求的“必经之路”,所以可以在这个HTTP请求传递到真正的请求处理中心(HttpHandler)之前附加一些需要的信息在这个...参考:各版本IIS下ASP.net请求处理过程区别    当一个http request发送到IIS5.X时,IIS先把虚拟目录转变为物理目录,然后根据文件后缀名检查iis中的metabase文件检查文件扩展名与可执行代码...中;这时从线程池获取空闲线程执行程序集(写一个网站发布成两个虚拟目录进行测试,可以看到执行http请求处理的线程不断地变化,两个虚拟目录会出现使用相同线程的情况)。...一般地,用户程序运行在User mode下,而操作系统代码运行在Kernel Mode下。Kernel Mode的代码允许访问所有系统内存和所有CPU指令。

    2.4K90

    《CLR via C#》笔记:第5部分 线程处理(2)

    异步函数的其他功能 应用程序及其线程处理模型 以异步方式实现服务器 取消I/O操作 有的I/O操作必须同步进行 I/O请求优先级 第二十八章 I/O限制的异步操作 Windows如何执行I/O操作 程序通过构造一个...然后,ReadFile 将你的线程从本机/用户模式代码转变成本机/内核模式代码,向内核传递IRP数据结构,从而调用Windows内核(③)。...每个设备驱动程序都维护着自己的IRP队列,其中包含了机器上运行的所有进程发出的IO请求。IRP数据包到达时,设备驱动程序将IRP信息传给物理硬件设备上安装的电路板。...现在,硬件设备将执行请求的1/O操作(⑤)。 最终,硬件设备会完成IO操作。然后,Windows 会唤醒你的线程,把它调度给一个CPU,使它从内核模式返回用户模式,再返回至托管代码(⑦,⑧和⑨)。...(P644 last2) 图片 Windows如何执行异步操作 下图删除了除硬盘之外的所有硬件设备,引入了CLR的线程池,稍微修改了代码。

    1.1K40

    通过避免下列 10 个常见 ASP.NET 缺陷使网站平稳运行

    当 ASP.NET 与 IIS 6.0 一起使用并且启用内核模式缓存时,OutputCacheModule 有时无法从它传递给 Http.sys 的缓存响应中删除 Set-Cookie 标头。...• Http.sys 在后续的请求中返回缓存响应,误将其他用户连接到会话。 故事的寓意又是什么呢?会话状态和内核模式输出缓存不能混合使用。...我只说一点就够了,ASP.NET 依赖于有限的线程池处理请求,如果所有线程都被占用来等待数据库查询、Web 服务调用或其他 I/O 操作完成,则在某个操作完成并且释放出一个线程之前,其他请求都必须排队等待...当请求排队时,性能会急剧下降。如果队列已满,则 ASP.NET 会使随后的请求失败并出现 HTTP 503 错误。这种情况不是我们希望在 Web 生产服务器的生产应用程序上所乐见的。...理论上,传统的内存泄漏不会发生在完全由托管代码组成的 ASP.NET 应用程序中。但是内存使用量不足会通过强制垃圾收集更频繁地发生而影响性能。

    3.6K80

    Asp.Net MVC3 简单入门第一季(四)详解Request Processing Pipeline

    当然在Asp.Net WebFrom下,所有的请求都是归结到Handler上,普通的Aspx、Ascx等都是继承自IHttpHandler接口的一些实例,所以我总结出来:WebFrom下所有的请求都是请求的...而做Asp.Net MVC的项目呢,所有的请求是都归结到Action上,Url应该是直接请求Action。 客户端发出请求后,此请求就会通过网络发出,可能经过多个路由、还可能经过域名解析等等.......第二阶段:IIS Web服务器         当一个请求到达IIS服务器后,Windows系统的内核模块 HTTP.SYS就能监听到此次请求,并将此次请求的URL、IP以及端口等信息解析出来并将此请求交给注册的应用来处理...如果你使用的是默认的配置,那么请求会传递到MvcRouteHandler,那么请求f附加着HttpContext就会到达Asp.Net MVC的处理中了。...后面所有的东西我们都可以直接通过源码来介绍了,而上面的所有的请求处理只能通过反射等方式来看或者学习,而后面的内容,我们可以幸福的直接看源码了。那就跟我走进它的管道怎么流动的吧...

    62311

    如何在 ASP.NET Core 中重写 URL

    下面我我们将学习重写和重定向之间的区别,和何时以及如何在ASP.NET Core 中使用它们。...上面简单的说了一下重写URL和重定向URL的例子,下面我们就来具体讲解以下重写和重定向。 重写 重写改变了当前请求的路径,通过中间件管道继续处理当前请求的所有现有状态。...重写后,注册的任何中间件都会收到新的URL,并使用新路径处理请求的其余部分。所有这一切都是作为一个单一的服务器请求的一部分发生的。 Tip:请求的 URL保持不变,不会更改为重写的 URL。...我肯可以使用如下代码重写URL: context.Request.Path 重定向 重定向是在浏览器中通过一个或HTTP响应头触发一个新的HTTP请求,来在服务器上触发一个新的请求。...对于简单的用例,使用显式中间件处理重写,对于需要基于规则的评估的更复杂的用例,不需要重新发明轮子,因为ASP.NET Core提供了重写中间件,该中间件使用基于HTTP的重写模块中获得的所有常见正则表达式扩展

    3.2K20

    Asp.net MVC 之 Contorllers(二)

    最后,只有符合预定义的 URL 格式(也就是路由)的请求,才被允许享用 ASP.NET MVC 运行时的服务。所有这些请求都被路由到一个共同的序实例化控制器类的HTTP处理程,并调用其中定义的方法。...HTTP 模块匹配到用户定义的 URL 路由请求的 URL,并将 HTTP 上下文设置为使用 ASP.NET MVC 标准的 HTTP 处理程序来处理该请求。...可以使用 ASP.NET MVC 应用程序中的 REST 方式,ASP.NET MVC 面向他是松耦合的,ASP.NET MVC 承认他的概念,如资源和行为,我们可以随意使用自己的语法来表达和实现资源和行动行为...最终决定如何重新映射所请求的 URL 完全是另一个组件。这就本段的主角路由处理程序。路由处理程序是处理匹配给定路由任何请求的对象。...属性路由 NuGet 的 ASP.NET MVC 5 中包含 AttributeRouting 。属性路由是所有有关使用属性直接在控制器的Action方法上定义的路由。

    1.9K60

    学习asp.net_IIS6.0进程模型

    其名称明确之处,该模型需要IIS6.0、然后,在windows2003的服务器上,仍然可以让asp.net遵守IIS5.0进程模型的规则。...w3wp.exeworker进程加载aspn_isapi.dll;该ISAPI扩展又加载通用语言运行库(CLR),并启动ASP.NET运行库管道来处理该请求。...当IIS6.0进程模型正在使用时,内置的ASP.NET工作进程会被禁用。   注意:只有asp.net1.1完全利用IIS6.0进程模型。...下图为IIS6.0进程模型   IIS6.0作为内核级模块实现其HTTP监听程序。因此,所有的输入请求首先由http.sys驱动程序以内核模式进行管理。...没有任何的第三方代码会与该监听程序交互,并且没有任何的用户模式冲突会影响IIS的稳定性。http.sys驱动程序监听请求,并把他们投递到合适的应用程序池的请求队列。

    1.7K00

    ASP.NET Process Model之一:IIS 和 ASP.NET ISAPI

    7深入的了解,所以在这里就不再介绍了,不过以后我将这方面的内容补上)的处理模型:IIS如何监听来自外界的Http request,如何根据ISAPI Extension Mapping将对于不同Resource...的请求分发给不同的ISAPI Extension,基于ASP.NET Resource的ASP.NET ISAPI如何将Request传递给ASP.NET Runtime 环境。...上图像我们展示了IIS 5.x如何处理一个基于ASP.NET Resource(以aspx为例)的Http Request的大体流程。...换句话说,在IIS 5.x中对Request的监听和分发是在User Mode中进行,在IIS 6中,这种工作被移植到kernel Mode中进行,所有的这一切都是通过一个新的组件:http.sys来负责...一般地,用户程序运行在User mode下,而操作系统代码运行在Kernel Mode下。Kernel Mode的代码允许访问所有系统内存和所有CPU指令。

    2.9K90

    ASP.NET MVC随想录——漫谈OWIN

    简单来说,当请求到达服务器时,Windows内核组件HTTP.SYS组件捕获请求,他会分析请求并决定是否交给IIS来处理,当请求到达IIS之后,IIS会根据处理程序映射来匹配请求并交给对应的程序集(实现了...当然,如果你需要的话,你可以构建自定义的宿主和Pipeline去处理Http 请求。...这一切的改变都是由于OWIN的出现,他提供了明晰的规范以便我们快速灵活的去扩展Pipeline来处理Http请求,甚至可以不写任何一句代码来切换不同的Web Server,前提是这些Web Server...所以该怎么开发就怎么开发,只不过我们将他们注册到OWIN Pipeline中去处理HTTP 请求,成为OWIN管道的一部分,所以此处的Application即正在意义上的处理程序代码。...同时,通过使用环境字典在各个中间件之间进行信息的传递,而非传统ASP.NET(System.Web)中使用HttpContext贯穿ASP.NET整个生命周期来传递。

    1.3K110

    ASP.NET那点不为人知的事(一)

    当浏览器请求 ASP.NET 文件时,IIS 会把该请求传递给服务器上的 ASP.NET 引擎,ASP.NET 引擎会逐行地读取该文件,并执行文件中的脚本,最后,ASP.NET 文件会以纯 HTML 的形式返回浏览器...HTTP.SYS组件 我们知道要访问一个网站,必须要其部署在相应服务器软件上(如IIS),浏览器向服务器发送请求之后,当请求通过Socket到达服务器时,首先服务器Windows内核中的HTTP.SYS...,用于装载专门处理ASP.NET页面的一个ISAPI扩展程序:aspnet_isapi.dll)响应请求,当请求处理完成时,HTTP.SYS又将结果发送出去(HTTP.SYS会在内部建立一个缓存区,用于缓存近期的处理结果...如果WP进程崩溃,所有正在处理中的请求都将维持“executing”状态一段时间,等到aspnet_isapi检测到WP进程死掉后,会自动丢弃所有的请求并释放已经分配的资源。...当不能从缓存中获取结果时,必须通过一次处理来计算出当前请求的结果。在ASP.NET中,用户处理请求以得到结果的对象称为处理程序Handler。

    1.1K80

    使用Azure Application Insignhts监控ASP.NET Core应用程序

    使用它可以监视实时应用程序。 它将自动检测性能异常,并且包含了强大的分析工具来帮助诊断问题,了解用户在应用中实际执行了哪些操作。 它旨在帮助持续提高性能与可用性。...摘自微软文档:app-insights-overview 在Azure创建Application Insignhts服务 上一次介绍了如何注册12个月免费订阅账号如何白嫖微软Azure12个月及避坑指南...简单的配置几行代码就可以运行了,对业务代码完全没有侵入。 找一个asp.net core的程序,在.csproj文件下加入Application Insignhts包的引用。...SQL请求耗时都在1ms左右,其中一次HTTP请求1.7s,那么很明显了,就是这个HTTP请求拖慢了整个请求,所有需要对这个HTTP请求进行优化。...总结 asp.net core程序使用Application Insignhts非常简单,通过简单的几行代码就集成完成,并且对业务代码零侵入。

    81420
    领券