浅谈ASP.NET Core 2.0 带初始参数的中间件(译)

问题

如何在ASP.NET Core 2.0向中间件传入初始参数?

答案

在一个空项目中,创建一个POCO(Plain Old CLR Object)来保存中间件所需的参数:

public class GreetingOptions
{
  public string GreetAt { get; set; }
  public string GreetTo { get; set; }
}

添加一个中间件:

public class GreetingMiddleware
{
  private readonly RequestDelegate _next;
  private readonly GreetingOptions _options;

  public GreetingMiddleware(RequestDelegate next, GreetingOptions options)
  {
    _next = next;
    _options = options;
  }

  public async Task Invoke(HttpContext context)
  {
    var message = $"Good {_options.GreetAt} {_options.GreetTo}";
    await context.Response.WriteAsync(message);
  }
}

答案1:实例类型

添加一个扩展方法来配置中间件:

public static IApplicationBuilder UseGreetingMiddleware(this IApplicationBuilder app, GreetingOptions options)
{
  return app.UseMiddleware<GreetingMiddleware>(options);
}

使用中间件:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
  app.UseGreetingMiddleware(new GreetingOptions {
    GreetAt = "Morning",
    GreetTo = "Tahir"
  });
}

答案2:函数类型

添加一个扩展方法来配置中间件:


public static IApplicationBuilder UseGreetingMiddlewareAction(this IApplicationBuilder app, Action<GreetingOptions> optionsAction)
{
  var options = new GreetingOptions();
  optionsAction(options);

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

使用中间件:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
  app.UseGreetingMiddlewareAction(options =>
  {
    options.GreetAt = "Morning";
    options.GreetTo = "Tahir";
  });
}

上述两种方法结果一致。

运行,此时页面显示:

讨论

之前我们曾讨论过,在单独的类中定义中间件并使用扩展方法将其添加到请求管道中是最佳实践。我们也可能需要向中间件传入参数,通过对ASP.NET Core源代码以及其他在线示例的学习,我总结出来上面两种模式。

上述的两种解决方法都非常直观。我们将参数封装到一个POCO类中,然后创建一个扩展方法来接受下面的参数:

1. POCO实例

2. 需要调用的函数(在函数内设置POCO)

注:POCO实例通过构造函数传入中间件。UseMiddleware()方法接收可变参数params object[],并将这些参数传入中间件构造函数。

配置服务

这些模式也能用于向服务容器中添加服务实例。为了便于说明,我们先添加一个服务:

public interface IMessageService
{
  string FormatMessage(string message);
}

public class MessageService : IMessageService
{
  private readonly GreetingOptions _options;

  public MessageService(GreetingOptions options)
  {
    _options = options;
  }

  public string FormatMessage(string message)
  {
    return $"Good {_options.GreetAt} {_options.GreetTo} - {message}";
  }
}

添加如下任一个扩展方法来配置服务:

public static IServiceCollection AddMessageService(this IServiceCollection services, GreetingOptions options)
{
  return services.AddScoped<IMessageService>(factory => new MessageService(options));
}

public static IServiceCollection AddMessageServiceAction(this IServiceCollection services, Action<GreetingOptions> optionsAction)
{
  var options = new GreetingOptions();
  optionsAction(options);

  return services.AddScoped<IMessageService>(factory => new MessageService(options));
}

在Configure()中使用此服务:

public void ConfigureServices(IServiceCollection services)
{
  services.AddMessageService(new GreetingOptions
  {
    GreetAt = "Morning",
    GreetTo = "Tahir"
  });

  services.AddMessageServiceAction(options =>
  {
    options.GreetAt = "Morning";
    options.GreetTo = "Tahir";
  });
}

因为ConfigureServices()先于Configure()执行,因此我们可以直接在Configure()注入此服务:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IMessageService msg)
{
  app.Run(async (context) =>
  {
    await context.Response.WriteAsync(msg.FormatMessage("by sanshi"));
  });
}

运行,此时页面显示:

源代码下载

原文:https://tahirnaushad.com/2017/08/29/passing-parameters-to-middleware-in-asp-net-core-2-0/

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Asp.Net Core 通过中间件防止图片盗链的实例

    一.原理 要实现防盗链,我们就必须先理解盗链的实现原理,提到防盗链的实现原理就不得不从HTTP协议说起,在HTTP协议中,有一个表头字段叫referer,采用URL的格式来表示从哪儿链接到当前的网页或文件.换句话说,通过referer,网站可以检测目标网页访问的来源网页,如果是资源文件,则可以跟踪到显示它的网页地址.有了referer跟踪来源就好办了,这时就可以通过技术手段来进行处理,一旦检测到来源不是本站即进行阻止或者返回指定的页面.如果想对自己的网站进行防盗链保护,则需要针对不同的情况进行区

  • 详解ASP.NET Core 中间件之压缩、缓存

    前言 今天给大家介绍一下在 ASP.NET Core 日常开发中用的比较多的两个中间件,它们都是出自于微软的 ASP.NET 团队,他们分别是Microsoft.AspNetCore.ResponseCompression 和 Microsoft.AspNetCore.ResponseCaching , 下面让我们一起看看的功能以及如何去使用吧. Getting Started Microsoft.AspNetCore.ResponseCompression Microsoft.AspNetCo

  • ASP.NET Core 2.0 带初始参数的中间件问题及解决方法

    问题 如何在ASP.NET Core 2.0向中间件传入初始参数? 答案 在一个空项目中,创建一个POCO(Plain Old CLR Object)来保存中间件所需的参数: public class GreetingOptions { public string GreetAt { get; set; } public string GreetTo { get; set; } } 添加一个中间件: public class GreetingMiddleware { private readon

  • 浅谈ASP.NET Core 2.0 中间件(译)

    问题 如何创建一个最简单的ASP.NET Core中间件? 答案 使用VS创建一个ASP.NET Core 2.0的空项目,注意Startup.cs中的Configure()方法: public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.Run(async (context) => { await context.Response.WriteAsync("Hello World! (Run)

  • ASP.NET Core中间件设置教程(7)

    Asp.Net Core-中间件 在这一章,我们将了解如何设置中间件.中间件技术在 ASP.NET Core中控制我们的应用程序如何响应 HTTP 请求.它还可以控制应用程序的异常错误,这是一个在如何进行身份验证和授权用户执行特定的操作的关键. 中间件是组装成应用的管道来处理请求和响应的软件组件. 每个组件可以选择是否要在管道中将请求传递到下一个组件,并可以在管道中执行某些操作之前和之后的任务. Request委托用于构建请求管道.Request委托用来处理每个HTTP请求. 每件中间件在 AS

  • 浅谈ASP.NET Core 中间件详解及项目实战

    前言 本篇文章是我们在开发自己的项目中实际使用的,比较贴合实际应用,算是对中间件的一个深入使用了,不是简单的Hello World. 中间件(Middleware)的作用 我们知道,任何的一个web框架都是把http请求封装成一个管道,每一次的请求都是经过管道的一系列操作,最终到达我们写的代码中.那么中间件就是在应用程序管道中的一个组件,用来拦截请求过程进行一些其他处理和响应.中间件可以有很多个,每一个中间件都可以对管道中的请求进行拦截,它可以决定是否将请求转移给下一个中间件. asp.net

  • 详解在ASP.NET Core 中使用Cookie中间件

    在 http:// ASP.NET Core 中使用Cookie中间件 ASP.NET Core 提供了Cookie中间件来序列化用户主题到一个加密的Cookie中并且在后来的请求中校验这个Cookie,再现用户并且分配到HttpContext对象的User属性中.如果你想提供自己的登录方式和用户数据你可以使用Cookie中间件来实现独立的功能. 添加和配置 第一步是增加Cookie中间件到你的应用中.首先使用nuget增加Microsoft.AspNetCore.Authentication.

  • 浅谈ASP.NET Core 2.0 带初始参数的中间件(译)

    问题 如何在ASP.NET Core 2.0向中间件传入初始参数? 答案 在一个空项目中,创建一个POCO(Plain Old CLR Object)来保存中间件所需的参数: public class GreetingOptions { public string GreetAt { get; set; } public string GreetTo { get; set; } } 添加一个中间件: public class GreetingMiddleware { private readon

  • 浅谈ASP.NET Core 2.0 布局页面(译)

    本文介绍了ASP.NET Core 2.0 布局页面,分享给大家,具体如下: 问题 如何在ASP.NET Core 2.0项目中共享可见元素.代码块和指令? 答案 新建一个空项目,首先添加GreetingService服务和UserViewModel模型: public interface IGreetingService { string Greet(string firstname, string surname); } public class GreetingService : IGre

  • 浅谈ASP.NET Core 2.0 部分视图(译)

    问题 如何在ASP.NET Core 2.0中使用部分视图来重用页面的公共部分? 答案 新建一个空项目,在Startup中添加MVC服务和中间件: public void ConfigureServices(IServiceCollection services) { services.AddMvc(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopmen

  • 浅谈ASP.NET Core 中jwt授权认证的流程原理

    1,快速实现授权验证 什么是 JWT ?为什么要用 JWT ?JWT 的组成? 这些百度可以直接找到,这里不再赘述. 实际上,只需要知道 JWT 认证模式是使用一段 Token 作为认证依据的手段. 我们看一下 Postman 设置 Token 的位置. 那么,如何使用 C# 的 HttpClient 访问一个 JWT 认证的 WebAPI 呢? 下面来创建一个 ASP.NET Core 项目,尝试添加 JWT 验证功能. 1.1 添加 JWT 服务配置 在 Startup.cs 的 Confi

  • 浅谈ASP.NET Core静态文件处理源码探究

    前言 静态文件(如 HTML.CSS.图像和 JavaScript)等是Web程序的重要组成部分.传统的ASP.NET项目一般都是部署在IIS上,IIS是一个功能非常强大的服务器平台,可以直接处理接收到的静态文件处理而不需要经过应用程序池处理,所以很多情况下对于静态文件的处理程序本身是无感知的.ASP.NET Core则不同,作为Server的Kestrel服务是宿主到程序上的,由宿主运行程序启动Server然后可以监听请求,所以通过程序我们直接可以处理静态文件相关.静态文件默认存储到项目的ww

  • 详解ASP.NET Core 2.0 路由引擎之网址生成(译)

    问题 如何在ASP.NET Core 2.0中由路由引擎来生成网址? 答案 新建一个空项目,修改Startup.cs文件,添加MVC服务和中间件: public void ConfigureServices(IServiceCollection services) { services.AddMvc(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopmen

  • 浅谈ASP.NET Core中间件实现分布式 Session

    1.1. 中间件原理 1.1.1. 什么是中间件 中间件是段代码用于处理请求和响应,通常多个中间件链接起来形成管道,由每个中间件自己来决定是否要调用下一个中间件. 1.1.2. 中间件执行过程 举一个示例来演示中间件的执行过程(分别有三个中间件:日志记录.权限验证和路由):当请求进入应用程序时,执行执行日志记录的中间件,它记录请求属性并调用链中的下一个中间件权限验证,如果权限验证通过则将控制权传递给下一个中间件,不通过则设置401 HTTP代码并返回响应,响应传递给日志中间件进行返回. 1.1.

  • 浅谈ASP.Net Core WebApi几种版本控制对比

    一.版本控制的好处: (1)有助于及时推出功能, 而不会破坏现有系统. (2)它还可以帮助为选定的客户提供额外的功能. API 版本控制可以采用不同的方式进行控制,方法如下: (1)在 URL 中追加版本或作为查询字符串参数, (2)通过自定义标头和通过接受标头 在这篇文章中, 让我们来看看如何支持多个版本的 ASP.NET Core Web API. 一.创建asp.net core webapi 项目,引用NuGet包:Install-Package Microsoft.AspNetCore

随机推荐