Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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

like image 457
jao Avatar asked Apr 20 '17 17:04

jao


People also ask

How can I get baseUrl in asp net core?

httpContextAccessor = httpContextAccessor; } public void OnGet() { var baseUrl = httpContextAccessor. HttpContext?. Request. BaseUrl(); // ... } }

How do I find the base URL of a controller?

How to Get the Base URL in an MVC Controller. Here's a simple one-liner to get the job done. var baseUrl = string. Format(“{0}://{1}{2}”, Request.

How do I get an API URL?

1. Through the dataset URL: You can get the API endpoint by simply taking the dataset's UID and replacing it in this string: https://domain/resource/UID.extension *where the extension is the data format you's like to pull the data as. For a full list of extension formats please go here.


3 Answers

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.

like image 78
NPNelson Avatar answered Oct 17 '22 02:10

NPNelson


If you need this anywhere in your app than you should create a class and add it as a service. Define your static class and your extension method for adding it to the service pipeline like this.

public class MyHttpContext
{
    private static IHttpContextAccessor m_httpContextAccessor;

    public static HttpContext Current => m_httpContextAccessor.HttpContext;

    public static string AppBaseUrl => $"{Current.Request.Scheme}://{Current.Request.Host}{Current.Request.PathBase}";
    
    internal static void Configure(IHttpContextAccessor contextAccessor)
    {
        m_httpContextAccessor = contextAccessor;
    }
}

public static class HttpContextExtensions
{
    public static void AddHttpContextAccessor(this IServiceCollection services)
    {
        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    }

    public static IApplicationBuilder UseHttpContext(this IApplicationBuilder app)
    {
        MyHttpContext.Configure(app.ApplicationServices.GetRequiredService<IHttpContextAccessor>());
        return app;
    }
}

It might be a little redundant to expose the HttpContext in this case but I find it very helpful.

You would than add it to the pipeline in your Configfure method which is located in Startup.cs

app.UseHttpContext()

From there it is simple to use it anywhere in your code.

var appBaseUrl = MyHttpContext.AppBaseUrl;
like image 25
Robert Avatar answered Oct 17 '22 00:10

Robert


All of these existing answers depend on an HttpContext object, which is only available during an incoming request. However, I needed to get the URLs in a background service where HttpContext was not available.

This information is also available in the Microsoft.AspNetCore.Hosting.Server.IServer service, as long as the actual host service provides this information. If you're using the default Kestrel server, I've found that it is indeed provided. I have not tested this when hosting IIS in-process or with other hosting models.

You need to get an instance of IServer and then look for the .Features entry of type IServerAddressesFeature. Here's an extension method to get the URL(s) directly from an IServiceProvider:

using Microsoft.AspNetCore.Hosting.Server;
using Microsoft.AspNetCore.Hosting.Server.Features;

public static ICollection<string> GetApplicationUrls(this IServiceProvider services)
{
    var server = services.GetService<IServer>();

    var addresses = server?.Features.Get<IServerAddressesFeature>();

    return addresses?.Addresses ?? Array.Empty<string>();
}

You could however accomplish the same thing by injecting IServer if DI services are available.

like image 19
Tobias J Avatar answered Oct 17 '22 02:10

Tobias J