Как я могу получить baseurl моего сайта в ASP.NET Core?

Скажем, мой веб-сайт размещен в папке mywebsite на сайте www.example.com, и я захожу на сайт https://www.example.com/mywebsite/home/about.

Как получить часть базового URL в контроллере MVC? Часть, которую я ищу, - https://www.example.com/mywebsite

Приведенный здесь пример не работает, так как у нас нет доступа к Request.Url в ASP.NET Core

Ответ 1

Вы все равно должны собрать все, что вам нужно. У вас есть доступ к объекту запроса, если ваш контроллер наследует от Controller.

Если вы используете VS2017, запустите новое приложение ASP.NET Core MVC и замените homcontontroller:

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();
    }
}

Я просто добавил некоторые вещи, которые могут вас заинтересовать в методе "О программе", но вы должны изучить остальную часть класса запросов, чтобы вы знали, что еще доступно.

Как отметил @Tseng, у вас может возникнуть проблема при запуске Kestrel за IIS или службой приложений Azure, но если вы используете пакет IISIntegration или пакет AzureAppServices (установив пакет Nuget и добавив его в Program.cs на свой WebHostBuilder), он должен передать эти заголовки вам. Он отлично работает для меня в Azure, потому что мне иногда приходится принимать решения, основываясь на том, какое имя хоста они попали. Пакеты IIS/Azure также отправляют исходный удаленный IP-адрес, который я регистрирую.

Ответ 2

Если вам нужно это где-то в вашем приложении, вам следует создать промежуточное программное обеспечение. Определите свой статический класс и метод расширения для добавления промежуточного программного обеспечения в конвейер сервиса, как это.

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;
    }
}

В этом случае может быть немного избыточно выставлять HttpContext, но я нахожу это очень полезным.

Затем вы добавите его в конвейер в своем методе Configfure, который находится в Startup.cs.

app.UseHttpContext()

Оттуда просто использовать его в любом месте вашего кода.

var appBaseUrl = MyHttpContext.AppBaseUrl;

Ответ 3

NPNelson ответ работает, если с .Value.ToString()

var baseUrl = $"{this.Request.Scheme}://{this.Request.Host.Value.ToString()}{this.Request.PathBase.Value.ToString()}";