当前位置: 首页 > news >正文

成品网站货源1688免费建设工程施工合同示范文本2023最新版

成品网站货源1688免费,建设工程施工合同示范文本2023最新版,php网站开发最低配置,市场采购贸易平台理解 dotNET Core 中的管道模型#xff0c;对我们学习 dotNET Core 有很大的好处#xff0c;能让我们知其然#xff0c;也知其所以然#xff0c;这样在使用第三方组件或者自己写一些扩展时#xff0c;可以避免入坑#xff0c;或者说避免同样的问题多次入坑。本文分为以下… 理解 dotNET Core 中的管道模型对我们学习 dotNET Core 有很大的好处能让我们知其然也知其所以然这样在使用第三方组件或者自己写一些扩展时可以避免入坑或者说避免同样的问题多次入坑。本文分为以下几个部分来进行介绍新老管道模型对比分析代码理解请求处理中间件和过滤器的区别自定义中间件新老管道模型对比我们知道在 Web 应用中无论使用什么技术都是客户端发送一个请求服务器端经过一系列的处理后返回结果给客户端。图1在服务器端返回响应前我们的请求都会经过一些列的处理才会产生最终的结果不管是之前的 dotNET Frameowrk 程序还是现在的 dotNET Core中间的处理都采用了管道的设计。ASP.NET 管道通常我们会将 ASP.NET 程序部署到 IIS 中这样就形成了 IIS 和 ASP.NET 运行时的双管道模型大致请求流程如下1、程序在 IIS 中运行后会启动一个名为 w3wp.exe 的进程我们进行服务器端 Debug 时就需要附加这个进程2、在 w3wp.exe 中利用 aspnet_isapi.dll 加载 .NET 运行时3、随后运行时 IsapiRuntime 会被加载加载后会接管整个 HTTP 请求然后创建一个 IsapiWorkerRequest 对象来包装 HTTP 请求4、包装好 HTTP 请求后将 IsapiWorkerRequest 传递给 ASP.NET 的 HttpRuntime 这时请求就进入了 ASP.NET 的管道5、HttpRuntime 会根据 IsapiWorkerRequest 对象创建表示当前 HTTP 请求上下文 (Context) 对象 HttpContext6、HttpContext 创建后HttpRuntime 会使用 HttpApplicationFactory 创建当前的 HttpApplication 对象HttpApplication 对象会有多个处理完后会被释放到 HttpApplication 的对象池中7、到了 HttpApplication 中之后就是我们所熟悉的 HttpModule 和 HttpHandler 了先经过 HttpModule 比如 ASP.NET 自带的授权、身份认证、缓存等就是通过 HttpModule 处理我们也可以自定义自己的 HttpModule 而具体的 aspx、ascx 等就是由 HttpHandler 处理。具体的处理流程图如下图2HttpModule 和 HttpHandler 的细化图如下图3dotNET Core 管道在 dotNET Core 中HttpModule 和 HttpHandler 已经消失了。取而代之的是 MiddleWare中间件 。在 Core 中请求处理管道由一个服务器和一组中间件来组成服务器默认就是内置的 Kestrel 官方经典的流程图如下图4请求经过中间件处理完后进入下一个中间件然后按照顺序依次返回。相比较原来的 HttpModule 更简单和轻量级而且即便是系统级别的中间件也是可以由用户自己选择使用的更加灵活同时也有更好的性能。更多中间件和 HttpModule 的对比可以参考https://docs.microsoft.com/zh-cn/aspnet/core/migration/http-modules?viewaspnetcore-3.1分析代码理解请求处理控制台程序在 Rider 中创建一个 dotNET Core 3.1 的控制台程序修改项目文件如下Project SdkMicrosoft.NET.Sdk.WebPropertyGroupTargetFrameworknetcoreapp3.1/TargetFramework/PropertyGroup /Project 控制台的 Skd 类型为 Microsoft.NET.Sdk 将其修改为 Microsoft.NET.Sdk.Web 后会自动引用 ASP.NET Core 的相关包。这样这个控制台就有了 Web 应用的能力了在 Program 类添加 using 引用using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Hosting; Main 函数添加如下代码Host.CreateDefaultBuilder().ConfigureWebHost(builder  builder.Configure(app  app.Run(context  context.Response.WriteAsync(hello world!))).UseKestrel().UseUrls(http://localhost:5000)).Build().Run(); 运行程序可以看到浏览器会显示 hello world图5Main 函数中的代码调用步骤如下调用类 Host 的静态方法 CreateDefaultBuilder 创建一个 IHostBuilder对象在 CreateDefaultBuilder 方法中系统帮我做了很多事情比如设置根目录、加载配置文件、配置默认日志框架等最终调用 IHostBuilder 的 Build 方法构建一个 IHost并调用扩展方法 Run在上面的 IHostBuilder 构建后调用 ConfigureWebHost 方法对请求处理管道进行定制该方法是 IHostBuilder 的一个扩展方法接收一个 Action类型的委托在该方法中可以注册服务和使用中间件比如上面例子中的 app.Run(context gt; context.Response.WriteAsync(hello world!)) 就是一个简单的中间件中间件被注册到 Configure 方法的参数 ActionIApplicationBuilder 委托中随后调用 UseKestrel 来构建一个 Kestrel 的服务器调用 UseUrls 方法来设置服务器监听的端口。控制台程序到 Web API 的转变如果我们创建的是一个 Web API 项目在 Program 类中会有一个 CreateHostBuilder 的静态方法来返回 IHostBuilder 对象public static IHostBuilder CreateHostBuilder(string[] args) Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder  { webBuilder.UseStartupStartup(); }); 上面代码中调用 webBuilder.UseStartup(); 加载了 Startup 类Startup 类并没有继承任何类但其实是按照 IStartup 接口的约束来实现的IStartup 接口代码如下  public interface IStartup{IServiceProvider ConfigureServices(IServiceCollection services);void Configure(IApplicationBuilder app);} ConfigureServices用来注册服务Configure用来加载中间件既然 Configure 方法是用来注册中间件的我们修改 Startup 类的 Configure 方法可以实现和上面的控制台例子一样的效果public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {app.Run(context  context.Response.WriteAsync(hello world!)); } 模拟多个中间件请求在 Configure 中注册中间件通常使用 app.Use() 方法Use 方法接收一个 FuncRequestDelegate, RequestDelegate 的委托作为参数这个委托即是我们的中间件而 RequestDelegate 代表着 HTTP 请求的处理器在整个请求处理中流转RequestDelegate 的参数 HttpContext 包装了 HttpRequest 和 HttpResponse。修改 Startup 类的 Configure 方法代码如下public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {app.Use(next {Console.WriteLine(第一个中间件);return new RequestDelegate(async context {await context.Response.WriteAsync(First Middleware Begin );await next.Invoke(context);await context.Response.WriteAsync($First Middleware );});});app.Use(next {Console.WriteLine(第二个中间件);return new RequestDelegate(async context {await context.Response.WriteAsync(Second Middleware Begin );await context.Response.WriteAsync(Second Middleware End );});}); } 先来看运行结果图6图7从图6 可以看出注册中间件的顺序和我们代码的顺序是相反的这个看看 ApplicationBuilder 的源码就清楚在 Build 方法中执行时将收集到的所有中间件进行了反转图8从图7 可以看出中间件的执行顺序是按照注册的顺序一个一个进入然后传递到后面一个中间件最后一个执行完后原路返回。中间件和过滤器的区别我们可以在中间件中进行请求到拦截做一些自己的处理或者可以直接中断请求同样 dotNET Core 中的 过滤器Filter也可以做同样的事情那么两者有什么区别呢在之前的文章 《dotNET Core WebAPI 统一处理返回值、参数验证、异常》 中就是通过过滤器来实现返回值、异常等的统一处理所以说过滤器跟 Controller 或者 Action 关系更紧密是整个 MVC 这个中间件的一部分。而中间件更多是关注业务无关的比如 Session 存储、身份认证等。在 Web API 中经常使用 Swagger 来做文档管理也是以中间件的方式来使用添加如下代码就可以app.UseSwagger(); app.UseSwaggerUI(c  {c.SwaggerEndpoint(/swagger/v1/swagger.json, DotNet Core WebAPI文档); }); 自定义中间件实现自己的中间件我们可以继承 IMiddleware 这个接口可以看看这个接口的代码只有一个方法需要实现public interface IMiddleware {Task InvokeAsync(HttpContext context, RequestDelegate next); } 现在来设定一个使用场景不一定恰当来使用自定义的中间件实现项目是前后端分离的开发模式接口需要只在当前站点中可以使用脱离站点去调用是不允许的假设当前站点为http://fwhyy.com 。1、创建 RequestSourceCheckMiddleware 类继承 IMiddleware 并实现方法public async Task InvokeAsync(HttpContext context, RequestDelegate next) {string urlRef  context.Request.Headers[Referer];if (string.IsNullOrWhiteSpace(urlRef) || !urlRef.Contains(http://fwhyy.com)){context.Response.StatusCode  403; await Task.CompletedTask;}else{await next.Invoke(context);} }2、创建扩展方法public static class RequestSourceCheckMiddlewareExtension {public static IApplicationBuilder UseRequestSourceCheck(this IApplicationBuilder app){app.UseMiddlewareRequestSourceCheckMiddleware();return app;} } 3、在 Starup 类的 Configure 方法中调用扩展方法使用中间件app.UseRequestSourceCheck(); 4、调用结果如下图8实现中间件我们也可以不继承 IMiddleware 接口按照约束去定义中间件的类一样可以实现功能在 dotNET Core 还有很多的地方使用着固有的约定比如 Starup 类也没有实现 IStarup 接口也是一样的道理。按照约定的方式实现代码如下public class RequestSourceCheckMiddlewareNew {private readonly RequestDelegate _next;public RequestSourceCheckMiddlewareNew(RequestDelegate next){_next  next;}public async Task Invoke(HttpContext context){string urlRef  context.Request.Headers[Referer];if (string.IsNullOrWhiteSpace(urlRef) || !urlRef.Contains(http://fwhyy.com)){ context.Response.StatusCode  403; await Task.CompletedTask;}else{await  _next.Invoke(context);}} } 希望本文对您有所帮助下一篇准备讲讲 Web API 中 Jwt 的使用。文中示例代码https://github.com/oec2003/DotNetCoreThreeAPIDemo
http://www.zqtcl.cn/news/288551/

相关文章:

  • 某某公司网站建设论文wordpress 企业 主题
  • 网站提示域名解析错误怎么办百度网址提交
  • 福建省住房城乡建设部网站车公庙网站建设
  • 长沙网站seo诊断ip138禁止查询该域名
  • 大学生网站设计作业动画ftp发布asp.net网站
  • 网站建设哪家企业好站内优化怎么做
  • 萌宝宝投票网站怎么做网上商城推广方法
  • 网站建设规划书样板社交电商
  • 网站怎么做直播功能吗水库信息化网站建设
  • c语言做网站账号登录系统外资公司代理注册
  • 建站公司塔山双喜做饲料推广哪个网站好
  • php网站后台入口拼多多海外跨境电商入驻流程
  • 0731网站平面logo设计公司
  • 网站设计制作报价图片欣赏wordpress福利
  • 网站上有什么作用自己做网站需要学什么
  • 在哪里做马可波罗网站wordpress中文站cn
  • 威海外贸建站制作游戏的平台
  • 网站栏目策划 有思想的新闻网站建设开发的流程
  • 网站描述修改潍坊百度网站排名
  • 网站开发设计的技术网站开发可能存在的困难
  • 单片机做网站网站地图那么建设
  • 手机版网站建设软件wordpress主题开发ide
  • 网站建设的技术有哪些内容网站推广优化排名
  • 网站开发用jsp网站开发需要什么技术
  • 网站打开404错误怎么解决网站开发树形图
  • 好的建设网站公司哪家好湖南省做网站的
  • 网站怎么上传网站建设可行性分析表
  • 东营做网站优化价格企业网站开发一般多少钱
  • 高端网站设计公司排名邢台哪里有做网站的
  • 广州网站开发 英诺科技营销式网站建设