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"));
});
}
运行,此时页面显示:

点击下载源码:http://xiazai.jb51.net/201710/yuanma/MiddlewareWithParameters.rar
总结
以上所述是小编给大家介绍的ASP.NET Core 2.0 带初始参数的中间件问题及解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
- 详解在ASP.NET Core 中使用Cookie中间件
- 详解ASP.NET Core 中间件之压缩、缓存
- 浅谈ASP.NET Core 中间件详解及项目实战
- 浅谈ASP.NET Core中间件实现分布式 Session
- Asp.Net Core 通过中间件防止图片盗链的实例
- ASP.NET Core应用错误处理之ExceptionHandlerMiddleware中间件呈现“定制化错误页面”
- Asp.net Core中如何使用中间件来管理websocket
- 浅谈ASP.NET Core 2.0 带初始参数的中间件(译)
- ASP.NET Core中间件计算Http请求时间示例详解
- ASP.NET Core自定义中间件如何读取Request.Body与Response.Body的内容详解
相关文章
GridView使用CommandField删除列实现删除时提示确认框
在.net2005提供的GridView中我们可以直接添加一个CommandField删除列完后在它的RowDeleting事件中完成删除2013-09-09
asp.net core configuration配置读取的实现
本文主要介绍了asp.net core configuration配置读取,configuration可以从命令行、环境变量、配置文件读取配置,具有一定的参考价值,感兴趣的可以了解一下2023-11-11
Entity Framework使用Code First模式管理存储过程
本文详细讲解了Entity Framework使用Code First模式管理存储过程的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-03-03
剖析Asp.Net Web API路由系统---WebHost部署方式
这篇文章主要介绍了剖析Asp.Net Web API路由系统---WebHost部署方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。2017-02-02


最新评论