asp.net - renderpartialasync - razor partial
¿Cómo puedo obtener la base de mi sitio en ASP.NET Core? (3)
Si necesita esto en cualquier lugar de su aplicación, debe crear un middleware. Defina su clase estática y su método de extensión para agregar el middleware a la tubería de servicio de esta 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 lo encuentro muy útil.
Debe agregarlo a la canalización en su método de 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;
Digamos que mi sitio web está alojado en la carpeta mywebsite de www.example.com y visito https://www.example.com/mywebsite/home/about .
¿Cómo obtengo la parte de url base en un controlador MVC? La parte que busco es https://www.example.com/mywebsite
El ejemplo que se muestra here no funciona, ya que no tenemos acceso a Request.Url en ASP.NET Core
Aún debe poder juntar lo que necesita. Tiene acceso al objeto de solicitud si su controlador hereda de Controller
.
Si está utilizando VS2017, inicie una nueva aplicación ASPNet Core MVC y reemplace el controlador del hogar por:
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 algunas de las cosas que podrían interesarle en el método "Acerca de", pero debe explorar el resto de la clase de solicitud para saber qué más hay disponible.
Como señaló @Tseng, es posible que tenga un problema al ejecutar Kestrel detrás de IIS o el Servicio de aplicaciones de Azure, pero si usa el paquete IISIntegration o el paquete AzureAppServices (al instalar el paquete Nuget y agregarlo en Program.cs a su WebHostBuilder), debería reenviar esos encabezados a usted. Funciona muy bien para mí en Azure, porque a veces tengo que tomar decisiones basadas en el nombre de host al que tocan. Los paquetes IIS / Azure también reenvían la dirección IP remota original, que yo registro.
string.Format("{0}://{1}{2}", Request.Url.Scheme, Request.Url.Authority, Url.Content("~"));
Puede consultar más información aquí: here