Owin / NancyFx根路径上的尾随斜杠

时间:2015-03-30 16:10:18

标签: asp.net-mvc owin nancy

我有一个使用AngularJs和UI路由器的Owin / NancyFx单页面应用程序。

它在IIS7中托管,而且大部分内容都在运行。然而,根本路径有一个令人讨厌的问题,我似乎无法解决。

我想在根路径上使用尾部斜杠,例如:

http://myserver.internaldomain.com/myapp/

这样,当UI路由器去处理hashbang路由时,所有网址都将如下所示:

http://myserver.internaldomain.com/myapp/#/mySpaRoute

但是,我似乎无法附加一个尾随斜杠,所以我的网址如下:

http://myserver.internaldomain.com/myapp#/mySpaRoute

我尝试创建一个Owin中间件,查看URL并重定向,如果最后缺少/。这适用于WebApi但不是NancyFx处理的所有路由。这似乎是合理的,因为NancyFx会尽早接管路由来处理渲染视图。

接下来,我尝试了一个NancyFx BeforeRequest管道lambda来做同样的事情,询问URL并根据需要添加/。然而,这导致了重定向循环。请求将作为:http://example.com/app进入管道,然后重定向到:http://example.com/app/,但是在下一个管道执行时,将删除尾随/并且管道处理程序将重定向再次 - 这是循环发生的地方。

所以我想简单地说,我如何让NancyFx在我的路线末尾添加一个尾随/

更新

去吃午餐,跟duck谈了一下,更新了所有的程序集,然后决定它只是我需要附加/的根获取路径,使hashbang路由看起来像样:

public class HomeModule : NancyModule
{
    // note this works fine when running from localhost, but when running
    // as an application in IIS, a redirect loop occurs
    public HomeModule()
    {
        Get["/"] = _ =>
        {
            var requestUri = new Uri(Request.Url);
            if (!requestUri.AbsoluteUri.EndsWith("/"))
            {
                var targetUri = requestUri.ToString() + "/";
                return Response.AsRedirect(targetUri);
            }

            const string view = "views/home.cshtml";
            var model = new { Title = Constants.ApplicationTitle };
            return View[view, model];
        }
    }
}

Annnnnnd 重定向循环。

1 个答案:

答案 0 :(得分:2)

最终这似乎是由Uri类引起的。在许多情况下,Uri类可以很好地删除尾部斜杠。这意味着我本质上是通过创建一个新的Uri来修复任何“格式错误”的网址。然后我通过向/添加Uri来打破这些漂亮的Uri。在重定向时,新投射的/将删除我无关的if,然后失败System.Web.HttpContextBase语句并且该过程将再次开始,因此通过重定向循环。

要解决此问题,我改为使用了owin环境上下文中提供的Request.Url属性,并检查了EnforceTrailingSlashMiddleware属性,该属性似乎是原始请求的Url,很少或没有后处理。< / p>

这些更改是在我之前写过的public override async Task Invoke(IOwinContext context) { var httpContext = context.Environment["System.Web.HttpContextBase"] as System.Web.HttpContextBase; if (httpContext != null && httpContext.Request != null && httpContext.Request.Url != null) { var path = httpContext.Request.Url.ToString(); /* formatter is a class ("SlashFormatter") with two methods: "ShouldAppendSlash" which takes a path string and returns a boolean (whether or not a slash should be appended) "AppendSlash" which takes a string, safely appends a slash and then returns the modified string. */ if (formatter.ShouldAppendSlash(path)) { var url = formatter.AppendSlash(path); context.Response.Redirect(url); } } await Next.Invoke(context); } 中进行的。这是调用方法:

{{1}}