services route net iservicecollection index example configureservices aspnetcore asp c# asp.net asp.net-mvc-5 owin

c# - route - net core configureservices



Reescribir URL en middleware OWIN (1)

Tengo un problema con la reescritura de URL que funciona en Global.asax pero no en el middleware OWIN.

Código global.asax

protected void Application_BeginRequest() { //Perfectly working rewrite. //By route rules, this resolves to the action Global() //of the HomeController HttpContext.Current.RewritePath("Home/Global"); }

Código de middleware OWIN (usado para detección de cultura, código abreviado para abreviar)

public class GlobalizationMiddleware : OwinMiddleware { public GlobalizationMiddleware(OwinMiddleware next) : base(next) { } public async override Task Invoke(IOwinContext context) { context.Request.Path = new PathString("/Home/Global"); await Next.Invoke(context); } }

Espero que se llame a la acción "Global" del controlador "Home" ... pero en su lugar, se llama a la acción predeterminada "Index".

Después de cambiar la ruta de context.Request.Uri.AbsoluteUri es http://localhost/Global/Home

Pero la Request.Url.AbsoluteUri del Controlador.Url.AbsoluteUri sigue siendo http://localhost

Incluso probé context.Environment["owin.RequestPath"] = "/Home/Global"; pero eso tampoco parece funcionar.

Antes de que nadie pregunte, sí, llamo a IAppBuilder.Use(typeof(GlobalizationMiddleware)) en Startup.cs y el depurador ingresa el método Invoke.

¿Qué estoy haciendo mal?

EDITAR

Incluso intenté hacer referencia a System.Web y luego hacer esto ... tampoco funciona :(

System.Web.Routing.RequestContext requestContext = context.Environment["System.Web.Routing.RequestContext"] as System.Web.Routing.RequestContext; requestContext.HttpContext.RewritePath("/Home/Global"); System.Web.HttpContextBase contextBase = context.Environment["System.Web.HttpContextBase"] as System.Web.HttpContextBase; contextBase.RewritePath("/Home/Global");

EDIT 2 - Encontré una solución de trabajo (ver abajo) pero no estoy seguro si es la solución correcta, los comentarios serían apreciados :)


Encontré una solución de trabajo.

Desafortunadamente, necesitaba incluir System.Web. Estoy alterando directamente el objeto RouteData en RequestContext.

System.Web.Routing.RequestContext requestContext = context.Environment["System.Web.Routing.RequestContext"] as System.Web.Routing.RequestContext; requestContext.HttpContext.RewritePath("Home/Global"); requestContext.RouteData.Values["action"] = "Global";

Pero esto se siente demasiado raro para mi gusto ... No estoy seguro si esta es la solución correcta, así que no aceptaré esto como la respuesta válida, tal vez alguien vendrá con una mejor solución.