C# ASP.NET核心-将自定义属性添加到HttpRequest

C# ASP.NET核心-将自定义属性添加到HttpRequest,c#,asp.net-core,middleware,C#,Asp.net Core,Middleware,我有一些ASP.NET中间件,可以在请求进入时对其进行分析。基于该HttpRequest中提供的内容,我想添加一个可以在代码中使用的自定义属性。我的问题是,有没有一种方法可以将属性添加到HttpRequest中,以便在控制器中访问它?例如,在我的控制器中,我希望执行以下操作: namespace MyWebsite.Controllers { public class MyController : Controller public IActionResult Index() {

我有一些ASP.NET中间件,可以在请求进入时对其进行分析。基于该HttpRequest中提供的内容,我想添加一个可以在代码中使用的自定义属性。我的问题是,有没有一种方法可以将属性添加到HttpRequest中,以便在控制器中访问它?例如,在我的控制器中,我希望执行以下操作:

namespace MyWebsite.Controllers
{
  public class MyController : Controller

  public IActionResult Index()
  {
    if (this.Request.MyProperty == null)
    {
      return View("~/Views/NoExist.cshtml");
    }
    return View ("/Views/Index.cshtml");
  }
}
//context here is the HttpContext
var myFeature = context.Features.Get<IMyFeature>();
if(myFeature != null){
    //consume your feature
}
MyProperty表示我希望通过自定义中间件注入或添加的自定义属性。这可能吗?如果是,怎么做?如果没有,建议的方法是什么

谢谢大家!

创建具有只读ConcurrentDictionary属性的singleton。或者,使用ConcurrentDictionary类型的只读静态属性创建静态类

将只读队列属性添加到全局类

使用HttpContext.TraceIdentifier作为唯一键并添加 将数据作为值发送到ConcurrentDictionary。还将HttpContext.TraceIdentifier和DateTime.Now添加到队列属性

创建一个清理方法,从队列和ConcurrentDictionary中删除旧数据,方法是将数据从队列中拉出,直到数据处于特定的时间段(例如90秒)以下

创建定期运行并调用cleanup方法的后台工作程序。有这样的库。您还可以在启动时剥离线程,但除非您对其进行编码,否则这将缺少冗余

使用HttpContext.TraceIdentifier键从任何调用的代码访问数据

快乐编码

创建具有只读ConcurrentDictionary属性的singleton。或者,使用ConcurrentDictionary类型的只读静态属性创建静态类

将只读队列属性添加到全局类

使用HttpContext.TraceIdentifier作为唯一键并添加 将数据作为值发送到ConcurrentDictionary。还将HttpContext.TraceIdentifier和DateTime.Now添加到队列属性

创建一个清理方法,从队列和ConcurrentDictionary中删除旧数据,方法是将数据从队列中拉出,直到数据处于特定的时间段(例如90秒)以下

创建定期运行并调用cleanup方法的后台工作程序。有这样的库。您还可以在启动时剥离线程,但除非您对其进行编码,否则这将缺少冗余

使用HttpContext.TraceIdentifier键从任何调用的代码访问数据


快乐编码

实现所需的传统方式是通过HttpContext.Items共享所有内容。这样,您应该自己管理密钥,甚至可以声明扩展方法,以便方便地设置和获取值

然而,在这里我想介绍一种与asp.net核心中的新概念请求功能相关联的新方法。与每个请求相关联的特性可以由管道沿线的不同中间件添加,并且可以由任何可用的中间件使用。这看起来更整洁、更有条理,尽管与旧方法相比可能不是很方便

假设您在中间件的上下文中,以下代码将添加一个公开您的属性的功能:

//declare the feature interface first
public interface IMyFeature {
    string MyProperty {get;}
}

//the concrete type for the feature
public class MyFeature : IMyFeature {
    public MyFeature(string myProperty){
        MyProperty = myProperty;
    }
    public string MyProperty {get;}
}

//the context is in your middleware
//add the feature
var myFeature = new MyFeature("value of your choice");
//context here is the HttpContext
context.Features.Set<IMyFeature>(myFeature);
现在,您可以在管道中的任何位置使用添加的功能,如下所示:

namespace MyWebsite.Controllers
{
  public class MyController : Controller

  public IActionResult Index()
  {
    if (this.Request.MyProperty == null)
    {
      return View("~/Views/NoExist.cshtml");
    }
    return View ("/Views/Index.cshtml");
  }
}
//context here is the HttpContext
var myFeature = context.Features.Get<IMyFeature>();
if(myFeature != null){
    //consume your feature
}

我认为requestfeatures概念的一个优点是它对特性接口的清晰定义,您的代码可以轻松地学习、引用和管理这些特性接口。即使将其移植到某个库中进行重用,也比使用HttpContext.Items访问共享数据时依赖某个常量键更有意义。当然,对于一些简单的数据共享,您可以只使用HttpContext.Items,请求功能应该在以后可能发展时使用,它有一个清晰的酷概念,并且可能包含更多数据。

实现您想要的功能的传统方法是通过HttpContext.Items共享所有内容。这样,您应该自己管理密钥,甚至可以声明扩展方法,以便方便地设置和获取值

然而,在这里我想介绍一种与asp.net核心中的新概念请求功能相关联的新方法。与每个请求相关联的特性可以由管道沿线的不同中间件添加,并且可以由任何可用的中间件使用。这看起来更整洁、更有条理,尽管与旧方法相比可能不是很方便

假设您在中间件的上下文中,以下代码将添加一个公开您的属性的功能:

//declare the feature interface first
public interface IMyFeature {
    string MyProperty {get;}
}

//the concrete type for the feature
public class MyFeature : IMyFeature {
    public MyFeature(string myProperty){
        MyProperty = myProperty;
    }
    public string MyProperty {get;}
}

//the context is in your middleware
//add the feature
var myFeature = new MyFeature("value of your choice");
//context here is the HttpContext
context.Features.Set<IMyFeature>(myFeature);
现在,您可以在管道中的任何位置使用添加的功能,如下所示:

namespace MyWebsite.Controllers
{
  public class MyController : Controller

  public IActionResult Index()
  {
    if (this.Request.MyProperty == null)
    {
      return View("~/Views/NoExist.cshtml");
    }
    return View ("/Views/Index.cshtml");
  }
}
//context here is the HttpContext
var myFeature = context.Features.Get<IMyFeature>();
if(myFeature != null){
    //consume your feature
}
我认为requestfeatures概念的一个优点是它对特性接口的清晰定义,您的代码可以轻松地学习、引用和管理这些特性接口。即使将其移植到某个库中进行重用,也比使用HttpContext.Items访问共享数据时依赖某个常量键更有意义。当然是为s
在一些简单的数据共享中,您可以只使用HttpContext。Items,请求功能应该在以后可能发展时使用,它有一个明确的酷概念,并且可能包含更多数据。

使用HttpContext.Items[]集合使用HttpContext.Items[]集合