C# MVC RouteBase路由重定向太多

C# MVC RouteBase routing too many redirects

我有这个自定义路由系统,我将在其中获得 路径控制器视图areas 从我的 DB 并根据 请求的路径 .

设置它们

我现在的问题是,当我尝试访问一个页面时,它给了我 too many redirects response

这个区域发生的事情是:

如果用户试图通过在浏览器中输入来 return 到上一页(我没有那个 link 的任何按钮),他会遇到重定向过多的问题。

由于代码有点大,我将在此处post:http://pastebin.com/yTdWKMp4

我只是遗漏了我的数据库逻辑。

这是怎么回事?我只能看到这个区域的问题,但我不确定它是否在其他区域发生。

编辑

这些是来自请求headers的

HTTP/1.1 302 Found
Cache-Control: private, no-store, max-age=1
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Expires: Wed, 25 Nov 2015 19:01:23 GMT
Last-Modified: Wed, 25 Nov 2015 19:01:22 GMT
Etag: ""
Location: /teste-lp
Server: Microsoft-IIS/8.0
X-AspNetMvc-Version: 3.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
X-UA-Compatible: IE=Edge,chrome=1
Date: Wed, 25 Nov 2015 19:01:22 GMT
Content-Length: 115

HTTP/1.1 200 OK
Cache-Control: private, no-store, max-age=1
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Expires: Wed, 25 Nov 2015 19:02:10 GMT
Last-Modified: Wed, 25 Nov 2015 19:02:09 GMT
Etag: ""
Server: Microsoft-IIS/8.0
X-AspNetMvc-Version: 3.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
X-UA-Compatible: IE=Edge,chrome=1
Date: Wed, 25 Nov 2015 19:02:12 GMT
Content-Length: 6852

编辑 2

经过多次调试和记录后,我发现了问题的开始,它与我在某个 session 为 null 时的重定向有关:

if (TempData["LeadID"] == null || Session["UnidadeCE"] == null)
{
    Response.Redirect( HelperMethods.CreateLink( Request.RawUrl.TrimStart( '/' ).Split( '/' )[0] ) );
    Response.End();

    return null;
}

我在约会和凭证上进行了此验证,如果他尝试重新加载页面,他将被重定向到表单页面。现在奇怪的是,当他更改 URL 时,RouteBase 会执行并尝试为那个新的 URL 获取 PageInfo(VirtualPath、Controller 和 View),并且在我搜索的那一刻出于某种原因我'我得到的是预约页面而不是表格,所以我回到同一页面并开始循环。

我已经用过滤和数据库搜索更新了我的 pastebin,我的数据库中没有重复的记录。它看起来像是某种奇怪的缓存,但 var 是本地的,没有共享。

编辑 3

经过一些 var 观察(我有近 6k 条路由)我发现问题出在我在第 128 行检查 pastebin 文件的路由之间,pageList 参数是我缓存中所有路由的列表,我做了一个url 基于搜索,然后我走我需要的路线,第 167 行是我的问题所在。那时我已经将我想要的路线的内容复制到我的 freakingPage var 中(我知道这不是很酷)然后我更改了 ActionController 的值但是还有什么发生的是 pageList var 和缓存中的值发生变化,第 203 行。

可能是什么原因造成的?

经过一些研究,我发现我的问题与我没有对来自缓存的值使用 Clone 这一事实有关。由于 .NET 缓存在您获取其值时会保留一个参考值,因此有必要对您从中获取的对象实施 ICloneable

因为我只是 "putting" 另一个 var 上的值,后来编辑这个 var 我实际上是在更改缓存上的原始值...因此我得到了一个错误 return 当我再次访问缓存时。

在我的例子中,由于我在我的控制器上进行了一些会话验证,我得到了重定向,第一次(新制作的缓存)我会点击正确的页面。但是在我尝试重新进入同一页面后,我会从中得到不同的值。

为了更正它,我在我的模型上实施了 ICloneable。如果有人也有这个问题,我也用新方法改变了我的例子。

http://pastebin.com/yTdWKMp4