OWIN中间件中的URL重写

时间:2015-01-31 13:40:12

标签: 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);
    }
}

我希望" Global"控制器的动作" Home"被调用...而是默认操作"索引"被称为。

路径更改后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 - 找到了一个可行的解决方案(见下文),但我不确定它是否是正确的解决方案,评论将不胜感激:)

2 个答案:

答案 0 :(得分:5)

我找到了一个有效的解决方案。

不幸的是,我需要包含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";

但这对我的口味来说太过苛刻......我不确定这是否是正确的解决方案所以我不会接受这个作为有效的答案,也许有人会提供更好的解决方案。

答案 1 :(得分:0)

我也遇到了这个问题,发现一种实现此目的的方法就是使用public static IServiceCollection AddWorkflowEngine<TScheme>(this IServiceCollection services, Action<WorkflowConfigurationOptions<TWorkflowScheme>> optionsAction) where TScheme : WorkflowScheme { service.TryAddScoped<WorkflowEngine<TScheme>>(); services.Configure(optionsAction); return services; }

HttpContext

如果您已经包含HttpContext.Current.RewritePath("/new/path"); ,这似乎是一个可行的解决方案。


OWIN是ASP.NET(System.Web)之上的一层,并且某些ASP.NET组件(例如MVC)不是基于OWIN而是直接基于ASP.NET构建的。

更深入地讲,System.Web没有对OwinRequest的任何引用,而只是处理System.Web.HttpContextsource),因此这就是设置OWIN请求路径的原因不会影响ASP.NET应用。