Introduction
While working on web applications, it’s quite natural that we need to jump between various environments (i.e. Development, Testing, Production, etc.) during various phases of the product life cycle. In other words, all these environments may have different-different host addresses. Let’s have a look at a few of those.
During the development phase, we usually run our application with http://localhost:8080/features/..., where our host is localhost:8080.
During the testing phase, the same application can be run on http://www.consumerapps.com/features/..., where our host is www.consumerapps.com.
Problem Statement
What if we want to get the hostname in a log file for an audit purpose. We cannot go and hardcode it in the application, as it may change based on the environment on which application is running. How do we achieve this?
Solution
In ASP.NET Core 3.1, it can be easily achieved using HttpContext. First change we have to do is, to register IHttpContextAccessor as a singleton.
- services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Next, we have to make it available to the controller via constructor injection:
- public class HomeController : Controller
- {
- private readonly ILogger<homecontroller> _logger;
- private readonly IHttpContextAccessor _httpContextAccessor;
- public HomeController(ILogger<homecontroller> logger, IHttpContextAccessor httpContextAccessor)
- {
- _logger = logger;
- _httpContextAccessor = httpContextAccessor;
- }
- }
Once the above setup is done, the host name can be accessed in any action using the below line of code:
- string host = _httpContextAccessor.HttpContext.Request.Host.Value;
Hope you enjoyed this tip!

Anders OlssonPosted Oct 14, 2020, 4:31 AM
Hm. Well ... Do you really have to do that? According to Microsoft, using IHttpContextAccessor is only needed inside a service. A controller has automatically access to the HttpContext via the HttpContext property in ControllerBase. See https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-context?view=aspnetcore-3.1
Ronika JencyPosted Sep 17, 2020, 11:10 PM
Additional Info: httpContextAccessor.HttpContext.Request.Scheme""://"+httpContextAccessor.HttpContext.Request.Host +httpContextAccessor.HttpContext.Request.PathBase - using this code you can get base url of your website.
JaletzinPosted Aug 4, 2020, 11:32 AM
Where do you do the services.AddSingleton? Its in startup.cs but state it.If itsn't in the controller? For example a healthcheck directly called from startup.cs? An example for manually instatiated object new Class(ContextAccessor) is even more useful. Also there is a "Ilogger"... why? is it mandatory or not? I know its for your example, but this adds confusion.