【问题标题】:C# MVC RouteBase routing too many redirectsC# MVC RouteBase 路由太多重定向
【发布时间】:2016-02-28 16:57:54
【问题描述】:

我有这个自定义路由系统,我可以从中获取路径控制器视图区域我的 DB 并根据请求的路径设置它们。

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

这方面发生的事情是:

  • 用户访问页面并填写表格;
  • 使用 AJAX 发布表单,然后使用 jquery 进行重定向;
  • 用户预约或生成凭证;

如果用户试图通过在浏览器上键入返回上一页(我没有指向该链接的任何按钮),他会遇到重定向过多的问题。

由于代码有点大,我将在此处发布: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 参数是我缓存中所有路由的列表,我进行了 url 搜索基于然后我采取我需要的路线,在第 167 行是我的问题所在。在那一刻,我已经将我想要的路线的内容复制到我的freakingPage var 中(不是很酷,我知道),然后我更改了ActionController 的值,但也会发生的是值的变化pageList var 以及缓存中的第 203 行。

这可能是什么原因?

【问题讨论】:

  • 如果您可以在本地重现问题,Chrome 或 Firefox 中的网络检查器在这里可能会有所帮助。使用它,您可以看到所遵循的实际重定向顺序。
  • 我做到了,它提供了很多重定向然后停止,如果您等待几秒钟并重新加载一切都很好,但这总是在您从表格更改到约会区域后发生,因为您可以在我的编辑中看到唯一的区别是在重定向标头中我有一个 Location 属性

标签: c# asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing


【解决方案1】:

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

由于我只是将值“放入”另一个 var 并稍后编辑此 var,我实际上是在更改缓存中的原始值……因此,当我再次访问缓存时,我得到了错误的返回.

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

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

http://pastebin.com/yTdWKMp4

【讨论】:

    猜你喜欢
    • 2015-12-30
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 2018-08-05
    • 2018-10-10
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多