将参数传递给ASP.NET Core 2.0中的中间件
问题
在ASP.NET Core的安装过程中,如何将参数传递给中间件?
解
在一个空的项目中添加一个POCO类来保存中间件的参数,
publicclass GreetingOptions
{
public string GreetAt { get; set; }
public string GreetTo { get; set; }
}
添加一个中间件,
publicclass GreetingMiddleware
{
private readonly RequestDelegate next;
private readonly GreetingOptions options;
public GreetingMiddleware(
RequestDelegate next,
GreetingOptions options)
{
this.next = next;
this.options = options;
}
public async Task Invoke(
HttpContext context)
{
var message = $"Good {this.options.GreetAt} {this.options.GreetTo}";
await context.Response.WriteAsync(message);
}
}
解决方案A - 实例类型
添加扩展方法来配置中间件,
publicstatic IApplicationBuilder UseGreeting(
this IApplicationBuilder app, GreetingOptions options)
{
return app.UseMiddleware<GreetingMiddleware>(options);
}
配置中间件,
publicvoid Configure(
IApplicationBuilder app,
IHostingEnvironment env)
{
app.UseGreeting(new GreetingOptions
{
GreetAt = "Morning",
GreetTo = "Tahir"
});
}
解决方案B - 功能类型
添加扩展方法来配置中间件,
publicstatic IApplicationBuilder UseGreeting(
this IApplicationBuilder app, Action<GreetingOptions> configureOptions)
{
var options = new GreetingOptions();
configureOptions(options);
return app.UseMiddleware<GreetingMiddleware>(options);
}
配置中间件,
publicvoid Configure(
IApplicationBuilder app,
IHostingEnvironment env)
{
app.UseGreeting(options =>
{
options.GreetAt = "Morning";
options.GreetTo = "Tahir";
});
}
讨论
我在之前的文章 中讨论过, 在独立的类中定义中间件并使用扩展方法添加到管道中是一种好的做法 。虽然我们也可能需要将信息传递给我们的中间件类,但是在深入挖掘ASP.NET Core源代码和其他样本时,我已经遇到了两种模式。
如上面的解决方案A和B所证明的那样,这是非常简单的。我们将我们的参数包装在一个POCO类中,并创建一个扩展方法,
POCO实例
函数调用,进而建立POCO。
请注意
POCO传递给构造函数中的中间件。UseMiddleware()方法需要params对象[]参数传递到中间件构造函数。
配置服务
这些模式也可以用来设置 服务容器的依赖注入。为了演示添加服务,
publicclass MessageService : IMessageService
{
private readonly MessageOptions options;
public MessageService(MessageOptions options)
{
this.options = options;
}
public string FormatMessage(string message)
{
// use options
returnthis.options.Format == MessageFormat.None ? message :
this.options.Format == MessageFormat.Upper ? message.ToUpper() :
message.ToLower();
}
}
添加这些扩展方法来配置服务,
// Instance Type
publicstatic IServiceCollection AddMessageFormatter(
this IServiceCollection services, MessageOptions options)
{
return services.AddScoped<IMessageService>(factory =>
{
returnnew MessageService(options);
});
}
// Function Type
publicstatic IServiceCollection AddMessageFormatter(
this IServiceCollection services, Action<MessageOptions> configureOptions)
{
var options = new MessageOptions();
configureOptions(options);
return services.AddScoped<IMessageService>(factory =>
{
returnnew MessageService(options);
});
}
使用其中之一配置服务,
// Instance Type
publicvoid ConfigureServices(
IServiceCollection services)
{
services.AddMessageFormatter(new MessageOptions
{
Format = MessageFormat.Lower
});
}
// Function Type
publicvoid ConfigureServices(
IServiceCollection services)
{
services.AddMessageFormatter(options =>
{
options.Format = MessageFormat.Lower;
});
}
将参数传递给ASP.NET Core 2.0中的中间件的更多相关文章
- 基础教程:上传/下载ASP.NET Core 2.0中的文件
问题 如何上传和下载ASP.NET Core MVC中的文件. 解 在一个空的项目中,更新 Startup 类以添加MVC的服务和中间件. publicvoid ConfigureServices( ...
- 避免在ASP.NET Core 3.0中为启动类注入服务
本篇是如何升级到ASP.NET Core 3.0系列文章的第二篇. Part 1 - 将.NET Standard 2.0类库转换为.NET Core 3.0类库 Part 2 - IHostingE ...
- Jmeter----A接口response中body的某一个参数传递给B接口request的body中使用(参数的传递)
示例:将接口"获取待办列表"response中body的id值传递给接口"删除待办"request的body中使用: 操作步骤如下: 第一步:给"获取 ...
- 在ASP.NET Core 2.0中使用CookieAuthentication
在ASP.NET Core中关于Security有两个容易混淆的概念一个是Authentication(认证),一个是Authorization(授权).而前者是确定用户是谁的过程,后者是围绕着他们允 ...
- 如何在ASP.NET Core 2.0中使用Razor页面
如何在ASP.NET Core 2.0中使用Razor页面 DotNetCore2017-11-22 14:49 问题 如何在ASP.NET Core 2.0中使用Razor页面 解 创建一个空的项 ...
- ASP.NET Core 3.0中使用动态控制器路由
原文:Dynamic controller routing in ASP.NET Core 3.0 作者:Filip W 译文:https://www.cnblogs.com/lwqlun/p/114 ...
- 探索 ASP.Net Core 3.0系列三:ASP.Net Core 3.0中的Service provider validation
前言:在本文中,我将描述ASP.NET Core 3.0中新的“validate on build”功能. 这可以用来检测您的DI service provider是否配置错误. 具体而言,该功能可检 ...
- ASP.NET Core 2.0 中读取 Request.Body 的正确姿势
原文:ASP.NET Core 中读取 Request.Body 的正确姿势 ASP.NET Core 中的 Request.Body 虽然是一个 Stream ,但它是一个与众不同的 Stream ...
- ASP.NET Core 1.0 中的依赖项管理
var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...
随机推荐
- 洛谷 P1260 工程规划(差分约束)
题目描述 造一幢大楼是一项艰巨的工程,它是由n个子任务构成的,给它们分别编号1,2,…,n(5≤n≤1000).由于对一些任务的起始条件有着严格的限制,所以每个任务的起始时间T1,T2,…,Tn并不是 ...
- 模拟在table中移动鼠标,高亮显示鼠标所在行,固定表头
<!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Conten ...
- JavaScript 对象属性作实参以及实参对象的callee属性
参考自<<JavaScript权威指南 第6版>> /* * 将对象属性用作实参, 从而不必记住参数的顺序. */ function arraycopy(from,from_s ...
- mongodb3 设置用户名密码 ,linux
--29T09:: I CONTROL [initandlisten] ** WARNING: You are running on a NUMA machine. --29T09:: I CONTR ...
- .NET基础 (20).NET中的数据库开发
ADO NET和数据库程序基础1 什么是关系型数据库2 如何通过SQL语句来实现行列转换3 ADO NET支持哪几种数据源 ADO NET和数据库的连接1 请简要叙述数据库连接池的机制2 如何提高连接 ...
- CodeForces - 669D——(思维题)
Little Artem is fond of dancing. Most of all dances Artem likes rueda — Cuban dance that is danced b ...
- CentOS 6.0下phpvod搭建教程(LAMP+phpvod)
之所以安装CentOS是因为之前试过RedHat,但是发现RedHat在安装时,无法获取安装源,原因是RedHat系统没有在RHN注册. 网上的很多教程都说可以直接换用CentOS的源,可我小搞里一会 ...
- IDEA配置spring
大半天都在看spring,以前总是看不下去,这次慢慢来,慢慢看. 看那些基础的,倒是还不错.好多都是关于helloworld的,写完helloworld,觉得不怎么形象.于是写了动物,作为接口. (1 ...
- WIN7或2008远程连接特别慢的解决方法 【转】
方法一. 原因在于从vista开始,微软在TCP/IP协议栈里新加了一个叫做“Window Auto-Tuning”的功能.这个功能本身的目的是为了让操作系统根据网络的实时性能,(比如响应时间)来动态 ...
- ({i:0#.w|nt authority\iusr})Sharepoint impersonates the IUSR account and is denied access to resources
This hotfix makes a new application setting available in ASP.NET 2.0. The new application setting is ...