学习笔记

架构班学习


Asp.Net core管道设计

<h1>Asp.Net Core管道设计</h1> <h2>1. 简介</h2> <p>Asp.Net Core中的管道设计是一种非常灵活且强大的机制,用于处理HTTP请求和响应。管道本质上是由多个中间件(Middleware)组成的序列,每个中间件都有机会对请求进行处理或对响应进行修改。</p> <h2>2. 多层委托嵌套组装</h2> <p>多个中间件被序列化处理,就像俄罗斯套娃一样,每个中间件可以选择是否调用下一个中间件。以下是管道模型的本质:<code>RequestDelegate</code>委托。</p> <h3>2.1 RequestDelegate</h3> <p><code>RequestDelegate</code>是一个接受<code>HttpContext</code>并返回一个<code>Task</code>的委托。每个中间件都是一个<code>RequestDelegate</code>,它接受一个<code>RequestDelegate</code>并返回另一个<code>RequestDelegate</code>。</p> <pre><code class="language-csharp">public delegate Task RequestDelegate(HttpContext context);</code></pre> <h3>2.2 用<code>Use</code>方法配置中间件</h3> <p>在Asp.Net Core中,使用各种<code>Use</code>方法(如<code>UseMiddleware</code>、<code>UseRouting</code>等)来配置中间件和最终构建管道模型。</p> <pre><code class="language-csharp">public void Configure(IApplicationBuilder app) { app.UseMiddleware&amp;lt;FirstMiddleware&amp;gt;(); app.UseMiddleware&amp;lt;SecondMiddleware&amp;gt;(); // ... app.UseEndpoints(endpoints =&amp;gt; { endpoints.MapControllers(); }); }</code></pre> <h2>3. 俄罗斯套娃效果,方便扩展</h2> <p>通过将中间件按照顺序组装成一个RequestDelegate链条,当HTTP请求进入时,它就像通过一组嵌套的俄罗斯套娃,一个接一个地处理请求。</p> <h3>3.1 每个中间件的调用关系</h3> <p>每个中间件都可以执行自己的逻辑,然后决定是否调用下一个中间件。</p> <pre><code class="language-csharp">public class FirstMiddleware { private readonly RequestDelegate _next; public FirstMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { // 逻辑处理 await _next(context); // 调用下一个中间件 } }</code></pre> <h3>3.2 管道模型的构建</h3> <p>最终的管道模型是通过注册中间件组装起来的。</p> <pre><code class="language-csharp">public void Configure(IApplicationBuilder app) { app.Use(async (context, next) =&amp;gt; { // 逻辑处理A await next(); // 逻辑处理B }); app.Use(async (context, next) =&amp;gt; { // 逻辑处理C await next(); }); // ...其他中间件 app.Run(async context =&amp;gt; { // 最终处理逻辑 await context.Response.WriteAsync(&amp;quot;Hello, World!&amp;quot;); }); }</code></pre> <h2>4. HTTP管道处理过程</h2> <p>Asp.Net Core的HTTP管道处理过程包括以下几个常见的中间件:</p> <ol> <li><strong>Session</strong>: 处理和管理用户会话。</li> <li><strong>Cookie</strong>: 处理和管理HTTP Cookie。</li> <li><strong>鉴权授权</strong>: 验证用户身份和检查权限。</li> <li><strong>缓存</strong>: 管理缓存策略以提升响应性能。</li> <li><strong>路由</strong>: 解析URL并匹配到相应的处理器(控制器)。</li> <li><strong>MVC</strong>: 使用MVC模式处理请求,返回视图或数据。</li> </ol> <p>以下是一个简单的管道示例:</p> <pre><code class="language-csharp">public void Configure(IApplicationBuilder app) { app.UseSession(); // 处理Session app.UseCookiePolicy(); // 处理Cookie Policy app.UseAuthentication(); // 处理身份验证 app.UseAuthorization(); // 处理权限验证 app.UseResponseCaching(); // 处理缓存 app.UseRouting(); // 处理路由 app.UseEndpoints(endpoints =&amp;gt; { endpoints.MapControllers(); // 处理控制器和动作 }); }</code></pre> <h3>总结</h3> <p>Asp.Net Core管道设计通过中间件的嵌套和组合,实现了灵活且扩展性强的请求处理机制。了解和掌握管道模型的构建方式和工作原理,能够帮助开发者更好地控制和优化Web应用的处理流程。</p>

页面列表

ITEM_HTML