问题

在ASP.NET Core的安装过程中,如何将参数传递给中间件?

在一个空的项目中添加一个POCO类来保存中间件的参数,

  1. publicclass GreetingOptions

  2. {

  3. public string GreetAt { get; set; }

  4. public string GreetTo { get; set; }

  5. }

添加一个中间件,

  1. publicclass GreetingMiddleware

  2. {

  3. private readonly RequestDelegate next;

  4. private readonly GreetingOptions options;

  5. public GreetingMiddleware(

  6. RequestDelegate next,

  7. GreetingOptions options)

  8. {

  9. this.next = next;

  10. this.options = options;

  11. }

  12. public async Task Invoke(

  13. HttpContext context)

  14. {

  15. var message = $"Good {this.options.GreetAt} {this.options.GreetTo}";

  16. await context.Response.WriteAsync(message);

  17. }

  18. }

解决方案A - 实例类型

添加扩展方法来配置中间件,

  1. publicstatic IApplicationBuilder UseGreeting(

  2. this IApplicationBuilder app, GreetingOptions options)

  3. {

  4. return app.UseMiddleware<GreetingMiddleware>(options);

  5. }

配置中间件,

  1. publicvoid Configure(

  2. IApplicationBuilder app,

  3. IHostingEnvironment env)

  4. {

  5. app.UseGreeting(new GreetingOptions

  6. {

  7. GreetAt = "Morning",

  8. GreetTo = "Tahir"

  9. });

  10. }

解决方案B - 功能类型

添加扩展方法来配置中间件,

  1. publicstatic IApplicationBuilder UseGreeting(

  2. this IApplicationBuilder app, Action<GreetingOptions> configureOptions)

  3. {

  4. var options = new GreetingOptions();

  5. configureOptions(options);

  6. return app.UseMiddleware<GreetingMiddleware>(options);

  7. }

配置中间件,

  1. publicvoid Configure(

  2. IApplicationBuilder app,

  3. IHostingEnvironment env)

  4. {

  5. app.UseGreeting(options =>

  6. {

  7. options.GreetAt = "Morning";

  8. options.GreetTo = "Tahir";

  9. });

  10. }

讨论

我在之前的文章 中讨论过, 在独立的类中定义中间件并使用扩展方法添加到管道中是一种好的做法 。虽然我们也可能需要将信息传递给我们的中间件类,但是在深入挖掘ASP.NET Core源代码和其他样本时,我已经遇到了两种模式。

如上面的解决方案A和B所证明的那样,这是非常简单的。我们将我们的参数包装在一个POCO类中,并创建一个扩展方法,

  1. POCO实例

  2. 函数调用,进而建立POCO。

请注意

POCO传递给构造函数中的中间件。UseMiddleware()方法需要params对象[]参数传递到中间件构造函数。

配置服务

这些模式也可以用来设置 服务容器的依赖注入。为了演示添加服务,

  1. publicclass MessageService : IMessageService

  2. {

  3. private readonly MessageOptions options;

  4. public MessageService(MessageOptions options)

  5. {

  6. this.options = options;

  7. }

  8. public string FormatMessage(string message)

  9. {

  10. // use options

  11. returnthis.options.Format == MessageFormat.None ? message :

  12. this.options.Format == MessageFormat.Upper ? message.ToUpper() :

  13. message.ToLower();

  14. }

  15. }

添加这些扩展方法来配置服务,

  1. // Instance Type

  2. publicstatic IServiceCollection AddMessageFormatter(

  3. this IServiceCollection services, MessageOptions options)

  4. {

  5. return services.AddScoped<IMessageService>(factory =>

  6. {

  7. returnnew MessageService(options);

  8. });

  9. }

  10. // Function Type

  11. publicstatic IServiceCollection AddMessageFormatter(

  12. this IServiceCollection services, Action<MessageOptions> configureOptions)

  13. {

  14. var options = new MessageOptions();

  15. configureOptions(options);

  16. return services.AddScoped<IMessageService>(factory =>

  17. {

  18. returnnew MessageService(options);

  19. });

  20. }

使用其中之一配置服务,

  1. // Instance Type

  2. publicvoid ConfigureServices(

  3. IServiceCollection services)

  4. {

  5. services.AddMessageFormatter(new MessageOptions

  6. {

  7. Format = MessageFormat.Lower

  8. });

  9. }

  10. // Function Type

  11. publicvoid ConfigureServices(

  12. IServiceCollection services)

  13. {

  14. services.AddMessageFormatter(options =>

  15. {

  16. options.Format = MessageFormat.Lower;

  17. });

  18. }

 

将参数传递给ASP.NET Core 2.0中的中间件的更多相关文章

  1. 基础教程:上传/下载ASP.NET Core 2.0中的文件

    问题 如何上传和下载ASP.NET Core MVC中的文件. 解 在一个空的项目中,更新 Startup 类以添加MVC的服务和中间件. publicvoid ConfigureServices( ...

  2. 避免在ASP.NET Core 3.0中为启动类注入服务

    本篇是如何升级到ASP.NET Core 3.0系列文章的第二篇. Part 1 - 将.NET Standard 2.0类库转换为.NET Core 3.0类库 Part 2 - IHostingE ...

  3. Jmeter----A接口response中body的某一个参数传递给B接口request的body中使用(参数的传递)

    示例:将接口"获取待办列表"response中body的id值传递给接口"删除待办"request的body中使用: 操作步骤如下: 第一步:给"获取 ...

  4. 在ASP.NET Core 2.0中使用CookieAuthentication

    在ASP.NET Core中关于Security有两个容易混淆的概念一个是Authentication(认证),一个是Authorization(授权).而前者是确定用户是谁的过程,后者是围绕着他们允 ...

  5. 如何在ASP.NET Core 2.0中使用Razor页面

    如何在ASP.NET Core 2.0中使用Razor页面  DotNetCore2017-11-22 14:49 问题 如何在ASP.NET Core 2.0中使用Razor页面 解 创建一个空的项 ...

  6. ASP.NET Core 3.0中使用动态控制器路由

    原文:Dynamic controller routing in ASP.NET Core 3.0 作者:Filip W 译文:https://www.cnblogs.com/lwqlun/p/114 ...

  7. 探索 ASP.Net Core 3.0系列三:ASP.Net Core 3.0中的Service provider validation

    前言:在本文中,我将描述ASP.NET Core 3.0中新的“validate on build”功能. 这可以用来检测您的DI service provider是否配置错误. 具体而言,该功能可检 ...

  8. ASP.NET Core 2.0 中读取 Request.Body 的正确姿势

    原文:ASP.NET Core 中读取 Request.Body 的正确姿势 ASP.NET Core 中的 Request.Body 虽然是一个 Stream ,但它是一个与众不同的 Stream ...

  9. ASP.NET Core 1.0 中的依赖项管理

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

随机推荐

  1. loadrunner12: Error -27492: "HttpSendRequest" failed, Windows error code=8

    这个问题我在网上看到有这样的解释:1.timeout时间超时设置问题2.Run-Time Settings -> Preferences -> Advanced. 确定此选项未被选中:&q ...

  2. 职责链模式c#(处理车)

    using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace 职责链模式{  ...

  3. Linux中逻辑卷(LVM)管理基本操作

    1.创建逻辑卷 原文:https://linux.cn/article-3965-1.html

  4. Access denied for user 'root'@'MiWiFi-Ryyy-srv' (using password: YES)

    虽然是跟很多人一样的问题但是原因不同,其他很多文章说是授权问题,也确实是授权问题,但是,配置文件写的是连接localhost,而这里不知道什么原因切换了使用的用户,变成了默认访问MiWiFi-Ryyy ...

  5. (最小生成树)Eddy's picture -- hdu -- 1162

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1162 Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  6. EventBus事件总线框架(发布者/订阅者模式,观察者模式)

    一. android应用内消息传递的方式: 1. handler方式-----------------不同线程间传递消息. 2. Interface接口回调方式-------任意两个对象. 3. In ...

  7. iptables 增删查改

    一,安装并启动防火墙 二.添加防火墙规则 1.添加filter表 2.添加nat表 指定位置添加 三.删除iptables规则 四.查看防火墙规则 1.查看filter表 2.查看nat表 五.修改规 ...

  8. StringFormate使用

    1常规类型的格式化 1.1显示不同转换符实现不同数据类型到字符串的转换 转换符   说明 示例 %s     字符串类型 “mingrisof” %c     字符类型 'm' %b 布尔类型 tru ...

  9. [Postgres]Postgres复制表

    在需要把含有分表的总表备份的时候想到的笨办法,如果有什么更先进的办法万望告知. 比如TableOld是由TableOld1,TableOld2,TableOld3组合而成,现在需要对TableOld进 ...

  10. 查看JVM内存使用情况

    Runtime run = Runtime.getRuntime(); long max = run.maxMemory()/(1024*1024); long total = run.totalMe ...