c# - OWIN 中间件中的 URL 重写

标签 c# asp.net asp.net-mvc-5 owin

我遇到了 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/

相关文章:

javascript - 如何查找特定对象并将它们放入javascript中的数组中

c# - 如何打印.aspx页面的一部分?

c# - Ajax jquery 传递多个参数 web 服务

asp.net - 在 ASP.net Web 应用程序中检索 COM 类工厂的异常

asp.net-mvc - 当路由具有多个值时如何构建 RouteValueDictionary?

asp.net-mvc - MVC 5 多种类型匹配 Controller

c# - 如何与数据库文件一起编写安装程序?

c# - C# 中 SQL 的转义字符

c# - 如何在 Angular 中解码 JWE token

c# - 如何在 LINQ 中执行多个左连接、分组依据和连接