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.AbsoluteUrihttp://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 个应用程序。