我正在开发几个项目,其中之一是一个 ASP.NET 4.5
应用程序,另一个是 .Net Core API 1.1
项目。ASP.NET应用程序使用 HttpContext
类读取cookie和页面头。现在,我需要将这个功能移植到一个 .net standard 库中,以便两个项目都能使用。但是我在 .net standard SDK 中找不到 HttpContext。有什么建议吗?
我正在开发几个项目,其中之一是一个 ASP.NET 4.5
应用程序,另一个是 .Net Core API 1.1
项目。ASP.NET应用程序使用 HttpContext
类读取cookie和页面头。现在,我需要将这个功能移植到一个 .net standard 库中,以便两个项目都能使用。但是我在 .net standard SDK 中找不到 HttpContext。有什么建议吗?
HttpContext
在 .NET Framework 和 .NET Core 上都有(它们都实现了 .NET Standard),但由于是特定于 Web 的,因此在 .NET Standard 上不存在。
所以,你有三个选择:
System.Web.HttpContext
Microsoft.AspNetCore.Http.HttpContext
HttpContext
的逻辑移出 .NET Standard 项目我不同意这些答案,也不同意只在 Web 项目中使用 HttpContext
的无稽之谈。这实际上是紧密耦合的,因为您希望能够重用代码,因此 .net core 或 .net standard 中的类库应该能够使用 HttpContext
。
因此,在 .NET Standard 中,您需要添加:
Microsoft.AspNetCore.Http.Abstractions
HttpContext.Current
,因此也就没有了会话和请求等等。Current
。namespace System.Web
{
public static class HttpContext
{
private static Microsoft.AspNetCore.Http.IHttpContextAccessor m_httpContextAccessor;
public static void Configure(Microsoft.AspNetCore.Http.IHttpContextAccessor httpContextAccessor)
{
m_httpContextAccessor = httpContextAccessor;
}
public static Microsoft.AspNetCore.Http.HttpContext Current
{
get
{
return m_httpContextAccessor.HttpContext;
}
}
}
}
Current
之前,您需要调用Configure()
来为其提供上下文。然而,问题在于HttpContext在不同的线程之间是不同的。因此,总的来说,这段代码似乎不太可能按预期工作。 - ManfredHttpContext
。尽管它没有包含在.NET Standard库中,但Microsoft.AspNetCore.Http.Abstractions
包(它针对.NET Standard 2.0)将使您能够使用HttpContext
。不要这样做。
假设您正在对从cookie中读取的数据执行操作X。您可以将此操作X移至库中。ASP.NET项目的工作是处理请求管道。读取cookie应该在那里处理。
public void ProcessRequest(object Request)
{
Type oT = Request.GetType();
string URL = oT.GetProperty("RawUrl").GetValue(Request).ToString();
// do something
}
然后从您的调用应用程序中:
oRR.ProcessRequest(HttpContext.Current.Request);
我已经从 .Net Framework 进行了测试,而不是从 .Net Core。如果 Core 中的上下文库具有不同的属性,则您可能需要检查由 GetType 返回的类型以决定要访问哪些属性名称。
我同意上面的答案,如果可能的话,应该让netstandard库保持简单并且没有网络请求。有一个System.Net.Http nuget包,它针对.net standard。如果您正在更新4.6.x及以上的完整框架和.net core,并且不想要asp.net core的开销,则可以使用此功能。
在调用旧类之前,您可以创建HttpContext.Current:
using System.Web;
using System.Web.SessionState;
System.Web.HttpContext.Current = new System.Web.HttpContext(new System.Web.HttpRequest("", "http://localhost", ""), new System.Web.HttpResponse(new System.IO.StringWriter()));
System.Web.SessionState.SessionStateUtility.AddHttpSessionStateToContext(
System.Web.HttpContext.Current,
new HttpSessionStateContainer("",
new SessionStateItemCollection(),
new HttpStaticObjectsCollection(),
20000,
true,
HttpCookieMode.UseCookies,
SessionStateMode.InProc,
false
)
);
HttpContext.Session.SetString("your_session_var", "1");
foreach (string item in HttpContext.Session.Keys)
{
System.Web.HttpContext.Current.Session[item] = HttpContext.Session.GetString(item);
}
调用您的旧类库方法