【问题标题】:an alternative for HttpContext.Current.Items.Contains(DataContextKey) in ASP.NET Core 2ASP.NET Core 2 中 HttpContext.Current.Items.Contains(DataContextKey) 的替代方案
【发布时间】:2017-12-23 22:36:01
【问题描述】:

我想将一些代码升级到ASP.NET Core 2。 我知道HttpContext.Current 已从ASP.NET Core 2 中删除,必须使用IHttpContextAccessor

但我不知道应该如何替换这段代码:

HttpContext.Current.Items.Contains(DataContextKey)

我该怎么做?

完整代码:

namespace Jahan.Infrastructure.DataAccess.DataContextStorage
{
    public class HttpDataContextStorageContainer<T> : IDataContextStorageContainer<T> where T : class
    {
        private const string DataContextKey = "DataContext";

        public T GetDataContext()
        {
            T objectContext = null;
            if (HttpContext.Current.Items.Contains(DataContextKey))
            {
                objectContext = (T)HttpContext.Current.Items[DataContextKey];
            }
            return objectContext;
        }

        public void Clear()
        {
            if (HttpContext.Current.Items.Contains(DataContextKey))
            {
                HttpContext.Current.Items[DataContextKey] = null;
            }
        }

        public void Store(T objectContext)
        {
            if (HttpContext.Current.Items.Contains(DataContextKey))
            {
                HttpContext.Current.Items[DataContextKey] = objectContext;
            }
            else
            {
                HttpContext.Current.Items.Add(DataContextKey, objectContext);
            }
        }
    }
}

【问题讨论】:

  • Jahan,我终于也这样做了。你的代码看起来和我的一模一样。也许我们使用的是相同的来源?如果是这样,如果您能分享通用源代码来帮助我进行转换,我将不胜感激。请问你有这个源代码的出处吗?非常感谢!

标签: c# asp.net-core asp.net-core-mvc asp.net-core-2.0


【解决方案1】:

注入IHttpContextAccessor 并通过它访问当前的HttpContext。其余的应该足够简单,可以重构。

例如。

public class HttpDataContextStorageContainer<T> : IDataContextStorageContainer<T> where T : class {
    private const string DataContextKey = "DataContext";
    private readonly IHttpContextAccessor accessor;

    public HttpDataContextStorageContainer(IHttpContextAccessor accessor) {
        this.accessor = accessor;
    }

    public T GetDataContext() {
        var current = accessor.HttpContext;
        T objectContext = null;
        if (current.Items.ContainsKey(DataContextKey)) {
            objectContext = (T)current.Items[DataContextKey];
        }
        return objectContext;
    }

    public void Clear() {
        var current = accessor.HttpContext;
        if (current.Items.ContainsKey(DataContextKey)) {
            current.Items[DataContextKey] = null;
        }
    }

    public void Store(T objectContext) {
        var current = accessor.HttpContext;
        if (current.Items.ContainsKey(DataContextKey)) {
            current.Items[DataContextKey] = objectContext;
        } else {
            current.Items.Add(DataContextKey, objectContext);
        }
    }
}

只需确保IHttpContextAccessor 及其实现已在服务容器中注册。默认不再添加。

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

【讨论】:

    猜你喜欢
    • 2017-02-03
    • 2018-01-07
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    相关资源
    最近更新 更多