使用来自 NetStandard2.0 库的 HttpContext 请求/响应/会话

Posted

技术标签:

【中文标题】使用来自 NetStandard2.0 库的 HttpContext 请求/响应/会话【英文标题】:Using HttpContext Request/Response/Session from NetStandard2.0 library 【发布时间】:2022-01-12 10:55:56 【问题描述】:

升级由 70 多个应用程序和 200 多个基类库 (C#) 组成的大型 .NET Framework 4.8 企业应用程序

基类库正在转换为 .NetStandard 2.0,以便它们可供 .NET Framework 和 .NET Core 应用程序使用。然后可以在准备好后完成每个应用程序的迁移。

遇到看似常见但无法找到解决方案的情况

基类库具有静态 HttpContext Request/Response/Session 引用。我知道我可以重构这些依赖项,但这是一项艰巨的工作;

用一个简单的例子;

public class QueryStringHelper : IQueryStringHelper

    public string GetValue(string key) => HttpContext.Current.Request[key];

HttpContext 在 System.Web 中并不存在,需要通过 IHttpContextAccessor 注入。

public class QueryStringHelper : IQueryStringHelper

    private readonly IHttpContextAccessor _httpContextAccessor;

    public QueryStringHelper(IHttpContextAccessor httpContextAccessor)
    
        _httpContextAccessor = httpContextAccessor;
    

    public string GetValue(string key) => _httpContextAccessor.HttpContext.Request[key];

在 .NET Core 应用程序中使用这个基类库非常简单,向 DI 容器注册

builder.Services.AddHttpContextAccessor();

但是.. 我们如何在 .NET Framework 应用程序中使用这个基类?这是完全错误的方法,还是有办法做到这一点?

【问题讨论】:

【参考方案1】:

.NET Framework 和 .NET Core 之间的这些类存在巨大的根本差异。

例如,.NET Framework 会话可以保存任何对象,而 .NET Core 会话只能存储字符串。

您不能简单地换掉这些类并期望您的代码在两者中都能工作。如果您确实需要您的项目跨 .NET Framework 和 .NET Core 工作,则需要多目标,并使用条件编译来解决差异。

Multi-targeting for NuGet Packages in your project file | Microsoft Docs

【讨论】:

以上是关于使用来自 NetStandard2.0 库的 HttpContext 请求/响应/会话的主要内容,如果未能解决你的问题,请参考以下文章

asp.netcore3.0 netstandard2.1 使用 DbProviderFactories 连接数据库

netstandard2.0 (.net standard 2.0) 类库不能引用 net461 (.net framework 4.6.1) 类库

没有找到元数据文件netstandard2.0 dll

vs2017创建支持多框架(net4.6.1;net4.6.2;netstandard2.0;netcoreapp2.0)版本

我们从哪里获得 .Net Standard 2.0 中的 System.IdentityModel

在 NetStandard 2 中反转跨度