As a general rule, converting a Web Forms or `MVC5` application to `ASP.NET Core` will require a significant amount of refactoring.
`HttpContext.Current` was removed in `ASP.NET Core`. Accessing the current HTTP context from a separate class library is the type of messy architecture that `ASP.NET Core` tries to avoid. There are a few ways to re-architect this in `ASP.NET Core`.
**HttpContext property**
You can access the current HTTP context via the `HttpContext` property on any controller. The closest thing to your original code sample would be to pass `HttpContext` into the method you are calling:
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 parameter in middleware**
If you're writing custom `middleware` for the `ASP.NET Core` pipeline, the current request's `HttpContext` is passed into your `Invoke` method automatically:
public Task Invoke(HttpContext context)
{
// Do something with the current HTTP context...
}
**HTTP context accessor**
Finally, you can use the `IHttpContextAccessor` helper service to get the HTTP context in any class that is managed by the `ASP.NET Core` dependency injection system. This is useful when you have a common service that is used by your controllers.
Request this interface in your constructor:
public MyMiddleware(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
You can then access the current HTTP context in a safe way:
var context = _httpContextAccessor.HttpContext;
// Do something with the `current HTTP context`...
`IHttpContextAccessor` isn't always added to the service container by default, so register it in `ConfigureServices` just to be safe:
public void ConfigureServices(IServiceCollection services)
{
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
// Other code...
}
As a general rule, converting a Web Forms or MVC5 application to ASP.NET Core **will require** a significant amount of refactoring.
`HttpContext.Current` was removed in ASP.NET Core. Accessing the current HTTP context from a separate class library is the type of messy architecture that ASP.NET Core tries to avoid. There are a few ways to re-architect this in ASP.NET Core.
## HttpContext property
You can access the current HTTP context via the `HttpContext` property on any controller. The closest thing to your original code sample would be to pass `HttpContext` into the method you are calling:
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 parameter in middleware
If you're writing [custom middleware](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware?tabs=aspnetcore2x#writing-middleware) for the ASP.NET Core pipeline, the current request's `HttpContext` is passed into your `Invoke` method automatically:
public Task Invoke(HttpContext context)
{
// Do something with the current HTTP context...
}
## HTTP context accessor
Finally, you can use the `IHttpContextAccessor` helper service to get the HTTP context in any class that is managed by the ASP.NET Core dependency injection system. This is useful when you have a common service that is used by your controllers.
Request this interface in your constructor:
public MyMiddleware(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
You can then access the current HTTP context in a safe way:
var context = _httpContextAccessor.HttpContext;
// Do something with the current HTTP context...
`IHttpContextAccessor` isn't always added to the service container by default, so register it in `ConfigureServices` just to be safe:
public void ConfigureServices(IServiceCollection services)
{
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
// Other code...
}