我遇到了 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);
}
}
我希望 Controller “Home”的“Global” Action 被调用...但相反,默认 Action “Index”被调用。
路径更改后context.Request.Uri.AbsoluteUri
是<a href="http://localhost/Global/Home" rel="noreferrer noopener nofollow">http://localhost/Global/Home</a>
但是 Controller 的Request.Url.AbsoluteUri
还是<a href="http://localhost" rel="noreferrer noopener nofollow">http://localhost</a>
我什至试过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";
但这对我来说感觉太老套了……我不确定这是否是正确的解决方案,所以我不会接受它作为有效答案,也许有人会提出更好的解决方案。
关于c# - OWIN 中间件中的 URL 重写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28252230/