当前位置: 首页 > 科技观察

如何在ASP.NetCore中使用条件中间件?

时间:2023-03-15 14:01:26 科技观察

【.com速译】ASP.NetCore是微软开源的跨平台框架,具有可扩展性、简化性和模块化等优点,可用于构建高性能的Web应用程序。可以在ASP.NetCore请求管道中使用中间件组件来自定义处理请求和响应的方式。ASP.NetCore中间件组件还可用于检查、路由或修改流经管道的请求和响应消息。本文讨论如何在ASP.NetCore中使用中间件执行一些高级操作。创建一个ASP.NetCoreMVC项目首先,让我们在VisualStudio中创建一个ASP.NetCore项目。假设您的系统上安装了VisualStudio2017或VisualStudio2019,请按照以下步骤在VisualStudio中创建一个新的ASP.NetCore项目。启动VisualStudioIDE。单击“创建新项目”。在CreateNewProject窗口中,从显示的模板列表中选择ASP.NetCoreWebApplication。点击下一步”。在“配置新项目”窗口中,为新项目指定名称和位置。单击创建。在接下来显示的“创建新的ASP.NetCoreWeb应用程序”中,选择.NetCore作为运行时环境,并从顶部下拉列表中选择ASP.NetCore2.2(或更高版本)。通过选择“Web应用程序(模型-视图-控制器)”作为项目模板来创建一个新的ASP.NetCore应用程序。确保未选中“启用Docker支持”和“HTTPS配置”复选框,因为我们不会在此处使用这些功能。确保身份验证设置为“无身份验证”,因为我们也不会使用身份验证。单击创建。按照这些步骤应在VisualStudio中创建一个新的ASP.NetCore项目。我们将在本文的其余部分使用该项目。ASP.NetCore中的Use、Run、Map等方法Use、Map、Run等方法用于在ASP.NetCore中配置HTTP管道。下面简要介绍了这些方法中的每一种及其用途。使用-此方法将执行委托,然后继续执行管道中的下一步。Use方法也可用于使管道短路。Run-此方法将执行委托并返回结果。Map-此方法将有条件地执行委托并返回结果。在ASP.NetCore中注册中间件ASP.NetCore中的中间件组件是在Startup类的Configure方法中注册的。使用*扩展方法来注册中间件。以下是注册中间件组件的语法。publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){app.UseMyCustomMiddleware();}值得一提的是,中间件组件是按照注册的顺序执行的。ASP.NetCore中的Invoke方法每个中间件组件都包含一个Invoke方法。此方法接受对HttpContext实例的引用作为参数。中间件组件可以在调用下一个中间件组件之前和之后执行操作。下面是一个典型的Invoke方法的例子:Map用于根据特定的请求路径进行分支,而MapWhen用于根据特定断言的结果进行分支。以下代码片段显示了如何使用Map方法来分支请求管道。publicclassStartup{privatestaticvoidMapRequestA(IApplicationBuilderapp){app.Run(asynccontext=>{awaitcontext.Response.WriteAsync("ThisisMapRequestA");});}privatestaticvoidMapRequestB(IApplicationBuilderapp){app.Run(asynccontext=>{awaitcontext.Response.WriteAsyncThisisMapRequestB");});}privatestaticvoidMapRequestC(IApplicationBuilderapp){app.Run(asynccontext=>{awaitcontext.Response.WriteAsync("ThisisMapRequestC");});}publicvoidConfigure(IApplicationBuilderapp){app.Map("/mapRequestPathA",MapRequestA);app.Map("/mapRequestPathB",MapRequestB);app.Map("/mapRequestPathB",MapRequestC);app.Run(asynccontext=>{awaitcontext.Response.WriteAsync("HelloWorld!");});}//Othermethods}MapWhen方法接受两个参数:FuncDelegate操作你可以在Startup类的Configure方法中使用如下代码片段,内容类型“text/html”是不允许的。publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){if(env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.MapWhen(context=>context.Request.ContentType.Equals("text/xml",StringComparison.InvariantCultureIgnoreCase),(IApplicationBuilderapplicationBuilder)=>{applicationBuilder.Run(asynccontext=>{awaitTask.FromResult(context.Response.StatusCode=StatusCodes.Status406NotAcceptable);});});app.UseMvc();}ASP.NetCore方法中的UseWhen方法可用于有条件地执行中间件。以下代码片段显示了如果请求路径以“/api”开头,UseWhen方法如何用于执行中间件组件。app.UseWhen(context=>context.Request.Path.StartsWithSegments("/api"),applicationBuilder=>{applicationBuilder.UseCustomMiddleware();});注意:与MapWhen不同的是,UseWhen方法会继续执行后面的中间件,而不管UseWhen断言是true还是false。让我们看一个例子。考虑代码的以下部分:app.UseMiddlewareA();app.UseWhen(context=>context.Request.Path.StartsWithSegments("/api"),applicationBuilder=>{applicationBuilder.UseMiddlewareB();});app.UseMiddlewareC();如果中间件没有短路,中间件A和C将一直执行。只有用“/api”切换请求路径才会执行中间件B。在ASP.NetCore中,请求处理管道中有一连串的中间件组件。所有请求和响应都流经此管道。当收到新请求时,这些中间件组件要么处理请求,要么将其传递给管道中的下一个组件。对于更复杂的请求处理,我们可以使用Map和MapWhen方法对管道进行分支,使用UseWhen有条件地执行中间件。【翻译稿件,合作网站转载请注明原译者和出处.com】