URL 在 OWIN 中间件中重写
URL rewrite in OWIN middleware
我遇到 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
为http://localhost/Global/Home
但是Controller的Request.Url.AbsoluteUri
还是http://localhost
我什至试过 context.Environment["owin.RequestPath"] = "/Home/Global";
但这似乎也不起作用。
在没有人问之前,是的,我在Startup.cs中调用了IAppBuilder.Use(typeof(GlobalizationMiddleware))
,调试器进入了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";
但这对我的口味来说太老套了...我不确定这是否是正确的解决方案,所以我不会接受它作为有效答案,也许有人会提出更好的解决方案。
我 运行 也参与其中,发现实现此功能的一种方法就是使用 HttpContext
HttpContext.Current.RewritePath("/new/path");
如果您已经包含 System.Web
无论如何这似乎是一个可行的解决方案。
OWIN 是在 ASP.NET (System.Web) 之上的一层,一些 ASP.NET 组件(例如 MVC)并不是建立在 OWIN 之上,而是实际上 ASP.NET直接。
更深入地看,OwinRequest
没有任何对 System.Web.HttpContext
的引用,而只是处理 Environment
(source),所以这就是设置 OWIN 请求的原因路径不影响 ASP.NET 个应用程序。
我遇到 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
为http://localhost/Global/Home
但是Controller的Request.Url.AbsoluteUri
还是http://localhost
我什至试过 context.Environment["owin.RequestPath"] = "/Home/Global";
但这似乎也不起作用。
在没有人问之前,是的,我在Startup.cs中调用了IAppBuilder.Use(typeof(GlobalizationMiddleware))
,调试器进入了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";
但这对我的口味来说太老套了...我不确定这是否是正确的解决方案,所以我不会接受它作为有效答案,也许有人会提出更好的解决方案。
我 运行 也参与其中,发现实现此功能的一种方法就是使用 HttpContext
HttpContext.Current.RewritePath("/new/path");
如果您已经包含 System.Web
无论如何这似乎是一个可行的解决方案。
OWIN 是在 ASP.NET (System.Web) 之上的一层,一些 ASP.NET 组件(例如 MVC)并不是建立在 OWIN 之上,而是实际上 ASP.NET直接。
更深入地看,OwinRequest
没有任何对 System.Web.HttpContext
的引用,而只是处理 Environment
(source),所以这就是设置 OWIN 请求的原因路径不影响 ASP.NET 个应用程序。