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");
}
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);
}
}
我希望调用控制器“ Home”的“ Global”操作...但是,将调用默认操作“ Index”。
之后的路径是改变context.Request.Uri.AbsoluteUri
IShttp://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");
编辑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";
但这感觉太不客气了……我不确定这是否是正确的解决方案,所以我不会接受此为有效答案,也许有人会提供更好的解决方案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句