gpt4 book ai didi

c# - ASP.NET Core - 将自定义属性添加到 HttpRequest

转载 作者:行者123 更新时间:2023-12-01 23:32:26 25 4
gpt4 key购买 nike

我有一些 ASP.NET 中间件可以在请求传入时对其进行分析。根据该 HttpRequest 中可用的内容,我想添加一个可以在我的代码中使用的自定义属性。我的问题是,有没有办法向 HttpRequest 添加一个属性,以便我可以在我的 Controller 中访问它?例如,在我的 Controller 中,我想做这样的事情:

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");
}
}

MyProperty 表示我想通过我的自定义中间件注入(inject)或添加的自定义属性。这可能吗?如果是这样,如何?如果不是,推荐的方法是什么?

谢谢!

最佳答案

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

但是在这里我想介绍一种与 asp.net core 中的新概念 request feature 相关联的新方法。与每个请求关联的功能可以由管道中的不同中间件添加,并且可以被任何(如果可用)使用。这看起来更整洁、更有条理,尽管与旧方法相比可能不是很方便。

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

//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);

现在在管道后面的任何地方,您都可以像这样使用添加的功能:

//context here is the HttpContext
var myFeature = context.Features.Get<IMyFeature>();
if(myFeature != null){
//consume your feature
}

我认为 request features 概念的优点在于它对 feature interfaces 的明确定义,您的代码可以轻松地学习、引用和管理这些接口(interface)。甚至将其移植到某个库中以供重用也比依赖某些常量 key 来访问共享数据(通过使用 HttpContext.Items 实现)更有意义。当然对于一些简单的数据共享,你可以只使用HttpContext.Items,request feature应该在它以后可能发展的时候使用,它周围有一个清晰的很酷的概念并且可能包含更多数据。

关于c# - ASP.NET Core - 将自定义属性添加到 HttpRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66120938/

25 4 0
文章推荐: javascript - 无法分配给对象 'property' 的只读属性 '#'