.net标准库中的HttpContext

时间:2017-11-17 19:11:04

标签: c# .net asp.net-core .net-standard

我正在处理几个项目,其中一个是ASP.NET 4.5应用程序,另一个是.Net Core API 1.1项目。 asp.net应用程序使用HttpContext类来读取cookie和页眉。现在,我需要将其移动到.net标准库,该项目可以使用。我在.net标准SDK中找不到HttpContext。有什么建议吗?

8 个答案:

答案 0 :(得分:15)

您的方法存在问题:.NET Standard是.NET最简单的实现方式,这意味着只实现了与平台和场景无关的基本功能。
.NET Framework和.NET Core上都存在HttpContext(顺便说一下,它们都实现了.NET标准),但是特定于Web,它在.NET Standard上不存在。

所以,你有三个选择:

  1. 定位.NET Framework并使用System.Web.HttpContext
  2. 目标.NET Core并使用Microsoft.AspNetCore.Http.HttpContext
  3. 将使用HttpContext的逻辑移离.NET标准项目
  4. 但请注意,这些课程差异很大。 .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);

        }

**调用旧的类库方法