ASP.NET Core 2.0 带初始参数的中间件问题及解决方法
 更新时间:2017年10月23日 10:03:29   作者:三生石上(FineUI控件)  

这篇文章主要介绍了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”));
});
}

运行,此时页面显示:

点击下载源码: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中间件实现分布式 SessionAsp.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的内容详解

.net
core
2.0
中间件

相关文章
asp.net实现利用反射,泛型,静态方法快速获取表单值到Model的方这篇文章主要介绍了asp.net实现利用反射,泛型,静态方法快速获取表单值到Model的方法,结合实例形式分析了asp.net中反射,泛型,静态方法给model赋值的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下 2015-11-11
.Net Core和jexus配置HTTPS服务方法下面小编就为大家分享一篇.Net Core和jexus配置HTTPS服务方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 2018-02-02
VisualStudio2019中为.NET Core WinForm App启用窗体设计器这篇文章主要介绍了VisualStudio2019中为.NET Core WinForm App启用窗体设计器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 2020-04-04
.Net与JS时间日期格式的转换问题对比分析这篇文章主要介绍了.Net与JS时间日期格式的转换问题,结合实例形式对比分析了JS与.Net针对时间日期格式的转换处理相关技巧,需要的朋友可以参考下 2016-08-08
asp.net 中静态方法和动态方法调用的区别实例分析动态方法,在使用时需要先创建实例,才能调用实例方法,而静态方法则不需要,直接使用即可。 2013-06-06
详解ASP.NET MVC的筛选器ASP.NET MVC提供了四种类型的筛选器(AuthorizationFilter、ActionFilter、ResultFilter和ExceptionFilter),本篇文章对其进行一一介绍,需要的朋友来看下吧 2016-12-12
ASP.NET MVC中将控制器分离到类库的实现这篇文章主要介绍了ASP.NET MVC中将控制器分离到类库的实现的相关资料,需要的朋友可以参考下 2015-06-06
Asp.Net套用母版页后元素ID不一致(个人总结)这篇文章主要介绍了Asp.Net套用母版页后元素ID不一致(个人总结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 2018-11-11
asp.net(c#)不可访问,因为它受保护级别限制asp.net(c#)不可访问,因为它受保护级别限制… 2007-06-06
swfupload ajax无刷新上传图片实例代码在这里上传图片就需要用到ajax无刷新上传图片,这里面包含的东西不是一点半点。这里用到的是一个插件swfupload实现无刷新上传图片,感兴趣的朋友可以参考下哈 2013-06-06

最新评论

声明:本站(华域联盟www.cnhackhy.com)所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。