How can I get the baseurl of my site in ASP.NET Core?

jao picture jao · Apr 20, 2017 · Viewed 75.6k times · Source

Say my website is hosted in the mywebsite folder of www.example.com and I visit https://www.example.com/mywebsite/home/about.

How do I get the base url part in an MVC controller? The part that I am looking for is https://www.example.com/mywebsite

The example listed here doesn't work as we don't have access to Request.Url in ASP.NET Core

Answer

NPNelson picture NPNelson · Apr 20, 2017

You should still be able to piece together what you need. You have access to the request object if your controller inherits from Controller.

If you are using VS2017, fire up a new ASPNet Core MVC app and replace the homecontroller with:

public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    public IActionResult About()
    {
        ViewData["Message"] = $"{this.Request.Scheme}://{this.Request.Host}{this.Request.PathBase}";

        return View();
    }

    public IActionResult Contact()
    {
        ViewData["Message"] = "Your contact page.";

        return View();
    }

    public IActionResult Error()
    {
        return View();
    }
}

I just put in some of the stuff that might interest you in the "About" method, but you should explore the rest of the request class so you know what else is available.

As @Tseng pointed out, you might have a problem when running Kestrel behind IIS or Azure App Service, but if you use the IISIntegration package or AzureAppServices package (by installing the Nuget package and adding it in Program.cs to your WebHostBuilder), it should forward those headers to you. It works great for me in Azure, because I sometimes have to make decisions based on which hostname they hit. The IIS/Azure packages also forward the original remote IP address, which I log.