【问题标题】:HttpContext .NET core saving instance in Middleware中间件中的 HttpContext .NET 核心保存实例
【发布时间】:2016-08-09 15:21:47
【问题描述】:

将 HttpContext 的实例存储在中间件中是否安全?

例子:

public class TestMiddleware
{        
    private readonly RequestDelegate next;    
    private HttpContext context;
    public TestMiddleware(RequestDelegate next)
    {
        this.next = next;
    }

    public async Task Invoke(HttpContext context)        
    {
        try
        {
            this.context = context;

我想在其他私有方法中使用它来处理它,所以我可以将它作为参数传递给这些函数,或者按照示例中所示使用它。

但它是线程安全的吗?

【问题讨论】:

    标签: c# asp.net-core asp.net-web-api2


    【解决方案1】:

    但它是线程安全的吗?

    不,不是,因为中间件必然是单例的。如果您将特定的HttpContext 存储在共享字段中,则可能会在另一个请求期间重用它(这很糟糕)。

    【讨论】:

    • 是什么让你认为“中间件必然是单例”?
    • @haim770 它们在启动期间被实例化并添加到请求管道中,这是不可变的:github.com/aspnet/HttpAbstractions/blob/dev/src/…
    • @haim770 如果您不信任我,很容易确认:创建自定义中间件并在其构造函数中放置断点。您会看到它只在启动时被调用一次。
    • 我知道中间件类型只会被实例化一次。不过,我不确定您能否保证单例式的生命周期。
    • 我猜你是对的。只是术语“单例”通常指的是模式,而不是对象的生命周期。
    猜你喜欢
    • 1970-01-01
    • 2019-11-16
    • 2014-01-13
    • 2020-07-26
    • 2020-08-05
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 2019-01-03
    相关资源
    最近更新 更多