【问题标题】:How to access ASP Core HttpContext in ASP 4.5 class library project?如何在 ASP 4.5 类库项目中访问 ASP Core HttpContext?
【发布时间】:2017-02-24 10:20:02
【问题描述】:

我有一个依赖于业务逻辑项目的ASP 4.5 网站,这是一个使用.Net v4.5 构建的类库。最近为了扩展开发,我计划引入额外的网站项目ASP Core。同样,我添加了业务逻辑项目的依赖。业务逻辑当前通过HttpContext.Current 实例评估requestcookiessession 相关的东西。当我通过ASP Core 网站访问业务逻辑时,这不起作用。

Access HttpContext.Current

我已经解决了上述问题,并且可以知道为什么当我通过 ASP Core 访问它时,HttpContext.Current 会显示为null。它的答案建议通过依赖注入填充引用类型IHttpContextAccessor。现在,问题是,这个接口属于库Microsoft.AspNet.Http,我没有看到将它添加到我的业务逻辑项目的方法。

请有人帮我将HttpContext 访问到我的业务逻辑项目中。

【问题讨论】:

    标签: asp.net-core asp.net-core-mvc


    【解决方案1】:

    我也有同样的需求。我解决这个问题的方法是创建自己的接口,这些接口存在于我的类库中,我使用这些接口来访问当前的 HttpContext,而不管库是在 4.5 http 上下文还是 MVC Core http 上下文下运行。

    为了进一步解释,ASP 4.5 框架和 ASP Core 框架都有一个 HttpContext 对象以及关联的 Request 和 Response 对象,但是它们定义在不同的命名空间中,并且两个框架都不知道其他框架的命名空间。所以我决定我需要我的库代码来访问在我的命名空间之一中定义的 IHttpContext。并且 IHttpContext 将使用在我的库的命名空间中定义的 IHttpRequest 和 IHttpResponse。最后,IHttpRequest 使用了在我的命名空间中定义的 ISession、IHeaders 和 ICookie。

    定义了这些接口后,在我的 ASP 4.5 网站中,我现在可以在 Web 层基于我的 IHttpContext 创建一个 HttpContext 类,并让该类基本上包装 ASP 4.5 HttpContext 对象。然后可以将我的 HttpContext 对象传递到我的库中使用。

    在我的 MVC Core 网站中,我现在可以在 Web 层基于我的 IHttpContext 创建一个 HttpContext 类,并让该类基本上包装 MVC Core HttpContext 对象。然后可以将我的 HttpContext 对象传递到我的库中以供使用,就像我在 ASP 4.5 环境下运行时一样。

    所以最后,我的库不知道它在后台实际访问的是哪个 HttpContext 对象(4.5 或 Core),因为它只知道该对象有权访问它的库中定义的 IHttpInterface 确认。

    最后一点,为了帮助解决名称冲突,我实际上是这样命名我的接口的:

    IAppHttpContext
    IAppHttpRequest
    IAppHttpResponse
    IAppHttpSession
    IAppHttpRequestHeaders
    IAppHttpRequestCookies
    

    请注意,并非 HttpContext 4.5 中可用的所有功能都在 MVC Core 中可用。两者非常相似,但有一些不同之处。最大的区别是 MVC Core Session 只能存储字节数组或字符串,而 4.5 的 session 可以存储对象。所以我的 IAppSession 只支持存储字节数组和字符串,我必须确保我的库的所有会话都需要使用它(我需要存储在会话中的所有对象都需要可序列化)。

    你可以想象,实现这个有点工作,但最终你将拥有一个可以访问 HttpContext 的库,而不关心它是在 4.5 HttpContext 还是 MVC Core HttpContext 下运行。有点整洁。

    祝你好运。

    【讨论】:

    • 非常感谢您抽出宝贵时间分享一个可行的解决方案。也感谢您的知识。
    • @Ron C - 只是为了感谢这个答案。在我的情况下,我只(当前!)需要访问我的库中的 SessionId(它被 ASP.NET Webforms 项目重用,现在还有 ASP.NET Core 站点),所以我的界面和包装类非常简单,但我似乎有它的工作,我很感激你的解释!
    【解决方案2】:

    我也有同样的问题。我通过在我的 project.json 文件中添加以下依赖项来将 http 包添加到类库中解决了这个问题

    “Microsoft.AspNetCore.Http.Abstractions”:“1.1.0”

    然后我像下面这样使用它

    public class sampleclass
    {
       private readonly IHttpContextAccessor context;
    
       public ISession GetSession()
       {
         return context.HttpContext.Session;
       }
    }
    

    谢谢。快乐编码:-)

    参考:http://benjii.me/2016/07/using-sessions-and-httpcontext-in-aspnetcore-and-mvc-core/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-11
      • 2022-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-03
      • 2016-06-10
      相关资源
      最近更新 更多