我正在处理几个项目,其中一个是ASP.NET 4.5
应用程序,另一个是.Net Core API 1.1
项目。 asp.net应用程序使用HttpContext
类来读取cookie和页眉。现在,我需要将其移动到.net标准库,该项目可以使用。我在.net标准SDK中找不到HttpContext。有什么建议吗?
答案 0 :(得分:15)
您的方法存在问题:.NET Standard是.NET最简单的实现方式,这意味着只实现了与平台和场景无关的基本功能。
.NET Framework和.NET Core上都存在HttpContext
(顺便说一下,它们都实现了.NET标准),但是特定于Web,它在.NET Standard上不存在。
所以,你有三个选择:
System.Web.HttpContext
Microsoft.AspNetCore.Http.HttpContext
HttpContext
的逻辑移离.NET标准项目但请注意,这些课程差异很大。 .NET Core版本是为ASP.NET Core创建的,与ASP.NET 4.5和olders有很大不同。
答案 1 :(得分:3)
如果您的目标是.NETStandard 2.0,那么可以使用HttpContext
。
虽然它未包含在.NET Standard库中,但Microsoft.AspNetCore.Http.Abstractions
包(以.NET Standard 2.0为目标)将使您能够使用HttpContext
。
答案 2 :(得分:1)
我需要将[读取cookie和页面标题]移动到.NET标准库中,该标准库可供项目使用...
不要这样做。
假设您正在对从Cookie中读取的数据执行操作X.您可以将此操作X移动到库中。 ASP.NET项目的工作是处理请求管道。读取cookie属于那里。
答案 3 :(得分:1)
我不同意这些答案,也没有同意只在Web项目中使用HttpContext
。实际上,这是紧密相关的,因为您希望能够重用代码,因此.net核心或.net标准中的类库应能够使用HttpContext
因此,在.NET Standard中,您要添加:
Microsoft.AspNetCore.Http.Abstractions
遗憾的是,新HttpContext有很多不同之处
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;
}
}
}
}
答案 4 :(得分:0)
我同意上面的答案,如果可能的话,您希望保持netstandard库简单且无需Web请求。有一个针对.net标准的System.Net.Http nuget包。如果要创建库并且不需要asp.net核心的开销,那么在为完整框架和.net核心更新4.6.x时可以使用此方法。
答案 5 :(得分:0)
一种方法是让调用过程将Http.Current.Request传递给Standard类中的方法作为类型object的参数。然后使用反射来访问属性。在您的标准课程中,类似:
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返回的类型,以确定要访问的属性名称。
答案 6 :(得分:0)
我知道您想要HttpContext,但是创建任何频道可能会有所帮助。因此,我举一个ContextChannel示例。因为我对类似于http的上下文感兴趣。
我只是创建ContextChannel,然后使用OperationContext,因为如果未创建上下文作用域,则Context Channel总是为空。
在我的示例中,它的工作方式如下;
ChannelFactory<T> factory = channelFactory;
factory.Endpoint.EndpointBehaviors.Add(new ClientMessagePropertyBehavior());
var proxy = (IClientChannel)factory.CreateChannel();
using (var contextScope = new OperationContextScope((IContextChannel)proxy))
{
Stopwatch sw = Stopwatch.StartNew();
HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
requestMessage.Headers["Authorization"] = accessToken;
OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
TResult result = codeBlock((T)proxy);
sw.Stop();
_tools.logInfo(string.Format(@"* Service client performance : {0} = {1} ms", codeBlock.Method.ToString(), sw.ElapsedMilliseconds));
success = true;
return result;
}
答案 7 :(得分:0)
您可以在调用旧类之前创建 HttpContext.Current:
使用 System.Web; 使用 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);
}
**调用旧的类库方法