Mir*_*rek 8 c# asp.net owin asp.net-mvc-5
我有一个URL重写问题,它在Global.asax中有效但在OWIN中间件中没有.
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");
}
Run Code Online (Sandbox Code Playgroud)
OWIN中间件代码(用于文化检测,代码缩短以简化)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我希望控制器"Home"的"全局"动作被调用......但是,调用默认动作"Index".
路径改变后context.Request.Uri.AbsoluteUri是http://localhost/Global/Home
但是控制器Request.Url.AbsoluteUri仍然存在http://localhost
我甚至尝试过,context.Environment["owin.RequestPath"] = "/Home/Global";但这似乎也没有用.
在有人问之前,是的,我IAppBuilder.Use(typeof(GlobalizationMiddleware))在Startup.cs中调用,调试器进入Invoke方法.
我究竟做错了什么?
编辑
我甚至尝试引用System.Web然后这样做...也不起作用:(
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");
Run Code Online (Sandbox Code Playgroud)
编辑2 - 找到一个有效的解决方案(见下文),但我不确定它是否是正确的解决方案,评论将不胜感激:)
我找到了一个有效的解决方
不幸的是,我需要包含System.Web.我正在直接改变RequestContext中的RouteData对象.
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";
Run Code Online (Sandbox Code Playgroud)
但这对我的口味来说太过苛刻......我不确定这是否是正确的解决方案所以我不会接受这个作为有效的答案,也许有人会提供更好的解决方案.