Как я могу получить 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()}";
Ответ 4
string.Format("{0}://{1}{2}", Request.Url.Scheme, Request.Url.Authority, Url.Content("~"));
вы можете проверить дополнительную информацию здесь:
Как я могу получить базовый URL-адрес моего webapp в ASP.NET MVC?