【问题标题】:Accessing httpcontext in class library with ASP.NET Core 1.1 (MVC)使用 ASP.NET Core 1.1 (MVC) 访问类库中的 httpcontext
【发布时间】:2017-09-17 14:25:04
【问题描述】:

我正在将我的 ASP.NET 4.6 框架代码迁移到 .NET Core。在这一点上,我只处于学习阶段。我是 MVC 的新手,因为我一直使用 WebForms,但我想远离 WebForms。我也是 ASP.NET Core 的新手。

基本上,我有一个类库来完成我的大部分工作 - 使我免于跨多个页面甚至网站重复代码(数据库、会话、自定义身份管理)。我将 DLL 添加到项目中,然后就可以使用了。

我发现 ASPNET Core 并不完全允许这样做。也许我不理解它,或者现在开始移植它还为时过早。

我需要能够访问我的类库中的 HttpContext 来操作会话、cookie 等内容。解决此问题的最简单方法是什么?我想一旦我能做到这一点,我就可以开始取得更好的进步。

或者,我是否需要重新考虑编写类库?据我了解,我需要编写中间件来实现这一点。但我能找到的每个例子要么不完整,要么已经过时。

欢迎提出任何建议。

【问题讨论】:

  • 你已经得到的答案是正确的,但是通过阅读你的帖子,也许你可以发布一些你已经拥有的示例代码(一个简单的类,只显示一种方法),然后人们可以帮助你特别是您的问题(例如,它可能更适合中间件)。
  • 谢谢 - 我其实只是在写测试代码,所以没有代码可以真正发布。但是,我确实根据这篇文章弄清楚了:blog.planetdiego.com/2016/10/…
  • 我设计了一种你可以使用的方法: stackoverflow.com/a/50815975/6778726
  • 我设计了一种可以使用stackoverflow.com/questions/48371304/…的方法

标签: c# asp.net-core asp.net-core-mvc asp.net-core-1.1


【解决方案1】:

HttpContext 用于全能逻辑并不是一个好主意,但如果您真的打算这样做,只需遵守 SOLID 原则之一,即。 依赖倒置原则

ASP.NET MVC 和它的继任者 ASP.NET Core 正是基于这一原则奠定了基础。 在需要它的类库中的任何类的构造函数中注入 IHttpContextAccessor


示例:

public class ContextHelper
{
    private IHttpContextAccessor _httpContextAccessor;

    public ContextHelper(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public void DoStuff()
    {
        DoOtherStuffWith(_httpContextAccessor.HttpContext);
    }
}

记得在默认 IoC 容器的Startup 中注册它,如下所示:

public class Startup
{
    // Rest of the class here...

    public void ConfigureServices(IServiceCollection services)
    {
        // Other registrations here...

        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    }
}

【讨论】:

  • 谢谢!!我终于弄清楚了我需要什么,而且效果很好!这是我找到的文章:blog.planetdiego.com/2016/10/… 看起来我的星期五晚上将是一个学习之夜(耶)。
【解决方案2】:

asp.netcore mvc 中,HttpContext 在控制器范围之外无法访问。因此,您无法直接访问类库中的HttpContext。您必须通过其他方式访问它。

您可以将HttpContext 从控制器的构造函数发送到类库类的构造函数,或者从控制器的操作方法发送到需要当前HttpContext 的特定库方法。

【讨论】:

【解决方案3】:

Step1: 在 Startup Class -> 在 ConfigureServices 添加下面一行

services.AddHttpContextAccessor();

第二步:在你的类库中。例如。

public class Dog
    {
        public HttpContext _httpContext => new HttpContextAccessor().HttpContext;
        public void Speak()
        {
            _httpContext.Response.WriteAsync("Dog says: Bow-Wow...\n");
        }
    }

【讨论】:

    猜你喜欢
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多