Digamos que mi sitio web está alojado en la carpeta mywebsite de www.example.com y que visito https://www.example.com/mywebsite/home/about.
¿Cómo obtengo la parte de la url base en un controlador MVC? La parte que estoy buscando es https://www.example.com/mywebsite
El ejemplo que aparece aquí no funciona porque no tenemos acceso a Request.Url en ASP.NET Core.
Usted todavía debe ser capaz de reconstruir lo que necesita. Tienes acceso al objeto request si tu controlador hereda de Controller
.
Si estás usando VS2017, inicia una nueva aplicación ASPNet Core MVC y reemplaza el homecontroller con:
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();
}
}
Acabo de poner en algunas de las cosas que podrían interesarle en el "Acerca de" método, pero usted debe explorar el resto de la clase de solicitud para que sepa qué más está disponible.
Como ha señalado @Tseng, podrías tener un problema al ejecutar Kestrel detrás de IIS o Azure App Service, pero si utilizas el paquete IISIntegration o AzureAppServices (instalando el paquete Nuget y añadiéndolo en Program.cs a tu WebHostBuilder), debería reenviarte esas cabeceras. A mí me funciona muy bien en Azure, porque a veces tengo que tomar decisiones en función del nombre de host al que llegan. Los paquetes IIS/Azure también reenvían la dirección IP remota original, que yo registro.
Si necesitas esto en cualquier parte de tu aplicación, entonces debes construir un middleware. Define tu clase estática y tu método de extensión para añadir el middleware a la cadena de servicios de la siguiente manera.
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;
}
}
Puede ser un poco redundante exponer el HttpContext en este caso, pero me parece muy útil.
A continuación, añadir a la tubería en su método Configfure que se encuentra en Startup.cs
app.UseHttpContext()
A partir de ahí es fácil de usar en cualquier parte de su código.
var appBaseUrl = MyHttpContext.AppBaseUrl;
string.Format("{0}://{1}{2}", Request.Url.Scheme, Request.Url.Authority, Url.Content("~"));
puede consultar más información aquí: https://stackoverflow.com/questions/1288046/how-can-i-get-my-webapps-base-url-in-asp-net-mvc