我有一个使用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 重定向循环。
答案 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}}