• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > ASP.NET Core 2.0 带初始参数的中间件问题及解决方法

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

作者:三生石上(FineUI控件) 字体:[增加 减小] 来源:互联网 时间:2018-08-20

三生石上(FineUI控件) 通过本文主要向大家介绍了.net,core,2.0,中间件等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

问题

如何在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 带初始参数的中间件问题及解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Asp.net SignalR 应用并实现群聊功能 开源代码
  • asp.net动态更新
  • asp.net利用母版制作页脚效果
  • Asp.Net服务器发送HTTP标头后无法设置内容类型的问题解决
  • 使用asp.net mvc,boostrap及knockout.js开发微信自定义菜单编辑工具(推荐)
  • 详解ASP.NET MVC 常用扩展点:过滤器、模型绑定
  • ASP.NET Core发送邮件的方法
  • 在ASP.NET Core 中发送邮件的实现方法(必看篇)
  • ASP.NET MVC从视图传参到控制器的几种形式
  • .net core使用redis基于StackExchange.Redis

相关文章

  • 2017-05-11ASP.NET 统计图表控件小结
  • 2017-05-11.Net core下直接执行SQL语句并生成DataTable的实现方法
  • 2017-05-11ASP.NET 连接ACCESS数据库的简单方法
  • 2017-05-11Asp.net后台调用js 2种方法
  • 2017-05-11Asp.net 页面导航的几种方法与比较 分享
  • 2017-05-11asp.net下利用JS实现对后台CS代码的调用方法
  • 2018-08-20asp.net实现的DES加密解密操作示例
  • 2017-05-11asp.net页面状态管理cookie和服务器状态管理Session
  • 2017-05-11swfupload ajax无刷新上传图片实例代码
  • 2017-05-11Linkbutton控件在项目中的简单应用

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • ASP.NET中TextBox使用Ajax控件显示日期不全的问题解决方法
    • asp.net Linq把数据导出到Excel的代码
    • 关于.NET Framework中的设计模式--应用策略模式为List排序
    • ASP.NET数据绑定之DataList控件
    • VS2005打开VS2008项目的2种方法(vs2005怎么打开2008)
    • .net GridView分页模板的实例代码
    • ASP.NET框架中的数据绑定概要与数据绑定表达式的使用
    • asp.net 删除,更新数据库方法
    • ASP.NET MVC下的四种验证编程方式[续篇]
    • GridView中点击CheckBox选中一行来改变此行的颜色

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有