使用来自 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) 类库
vs2017创建支持多框架(net4.6.1;net4.6.2;netstandard2.0;netcoreapp2.0)版本