一尘不染

如何在ASP.NET Core中获取HttpContext.Current?[重复]

c#

我们当前正在使用ASP.NET Core重写/转换我们的ASP.NET WebForms应用程序。尽量避免重新设计。

我们HttpContext在类库中使用一节来检查当前状态。如何HttpContext.Current在.NET Core 1.0中访问?

 var current = HttpContext.Current;
     if (current == null)
      {
       // do something here
       // string connection = Configuration.GetConnectionString("MyDb");
      }

我需要访问它以构建当前的应用程序主机。

$"{current.Request.Url.Scheme}://{current.Request.Url.Host}{(current.Request.Url.Port == 80 ? "" : ":" + current.Request.Url.Port)}";

阅读 931

收藏
2020-05-19

共1个答案

一尘不染

通常,将Web窗体或MVC5应用程序转换为ASP.NET Core 将需要 大量的重构。

HttpContext.Current已在ASP.NET Core中删除。从单独的类库访问当前HTTP上下文是ASP.NET
Core试图避免的混乱体系结构类型。有几种方法可以在ASP.NET Core中对其进行重新架构。

HttpContext属性

您可以通过HttpContext任何控制器上的属性访问当前HTTP上下文。与原始代码示例最接近的事情是将其传递HttpContext给您正在调用的方法:

public class HomeController : Controller
{
    public IActionResult Index()
    {
        MyMethod(HttpContext);

        // Other code
    }
}

public void MyMethod(Microsoft.AspNetCore.Http.HttpContext context)
{
    var host = $"{context.Request.Scheme}://{context.Request.Host}";

    // Other code
}

中间件中的HttpContext参数

如果您正在为ASP.NET Core管道编写自定义中间件,则当前请求HttpContextInvoke自动传递到您的方法中:

public Task Invoke(HttpContext context)
{
    // Do something with the current HTTP context...
}

HTTP上下文访问器

最后,您可以使用IHttpContextAccessor帮助程序服务来获取由ASP.NET
Core依赖项注入系统管理的任何类中的HTTP上下文。当您拥有控制器使用的通用服务时,此功能很有用。

在构造函数中请求此接口:

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

然后,您可以以安全的方式访问当前的HTTP上下文:

var context = _httpContextAccessor.HttpContext;
// Do something with the current HTTP context...

IHttpContextAccessor默认情况下并不总是将其添加到服务容器中,因此ConfigureServices为了安全起见将其注册:

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpContextAccessor();
    // if < .NET Core 2.2 use this
    //services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();

    // Other code...
}
2020-05-19