我有这个自定义路由系统,我将从中获取路径,控制器,视图和区域我的数据库,并根据请求的路径设置它们。
我现在的问题是,当我尝试访问一个页面时,它会给我too many redirects response
。
这方面的情况是:
如果用户尝试通过在浏览器上键入它来返回上一页(我没有任何该链接的按钮),则会出现太多重定向问题。
由于代码有点大,我将在此处发布:http://pastebin.com/yTdWKMp4
我只遗漏了我的数据库逻辑。
这可能是做什么的?我只能看到这方面的问题,但我不确定在其他方面没有发生。
修改
这些是请求中的标头
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
经过多次调试和记录后,我发现了问题的开始,它与某个会话为空时的重定向有关:
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参数是我从缓存中所有路由的列表,我做了网址搜索基于然后我采取我需要的路线,在第167行是我的问题所在。那时我已经将我想要的路线内容复制到我的freakingPage
var(不太酷,我知道),然后我改变了Action
和Controller
的值,但是发生的是pageList
var以及Cache的第203行的值更改。
导致这种情况的原因是什么?
答案 0 :(得分:0)
经过一些研究后,我发现我的问题与我没有对来自缓存的值使用Clone
这一事实有关。由于.NET缓存在获得其值时保留了引用值,因此必须对从中获取的对象实现ICloneable
。
因为我只是"把"另一个var的值以及稍后编辑这个var我实际上是在更改缓存中的原始值...当我再次点击缓存时,我收到了错误的返回。
在我的情况下,我得到了重定向,因为我在Controller上进行了一些会话验证,第一次(新制作的缓存)我会点击正确的页面。但在我尝试重新进入同一页面之后,我会从中获得不同的价值。
为了纠正它,我在我的模型上实现了ICloneable
。如果有人也有这个问题,我也用新方法改变了我的例子。