C# MVC RouteBase路由重定向太多
C# MVC RouteBase routing too many redirects
我有这个自定义路由系统,我将在其中获得 路径、控制器、视图 和 areas 从我的 DB 并根据 请求的路径 .
设置它们
我现在的问题是,当我尝试访问一个页面时,它给了我 too many redirects response
。
这个区域发生的事情是:
- 用户访问页面并填写表格;
- 使用 AJAX 编辑表单 post,然后从 jquery;
进行重定向
- 用户预约或生成凭证;
如果用户试图通过在浏览器中输入来 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 中(我知道这不是很酷)然后我更改了 Action
和 Controller
的值但是还有什么发生的是 pageList
var 和缓存中的值发生变化,第 203 行。
可能是什么原因造成的?
经过一些研究,我发现我的问题与我没有对来自缓存的值使用 Clone
这一事实有关。由于 .NET 缓存在您获取其值时会保留一个参考值,因此有必要对您从中获取的对象实施 ICloneable
。
因为我只是 "putting" 另一个 var 上的值,后来编辑这个 var 我实际上是在更改缓存上的原始值...因此我得到了一个错误 return 当我再次访问缓存时。
在我的例子中,由于我在我的控制器上进行了一些会话验证,我得到了重定向,第一次(新制作的缓存)我会点击正确的页面。但是在我尝试重新进入同一页面后,我会从中得到不同的值。
为了更正它,我在我的模型上实施了 ICloneable
。如果有人也有这个问题,我也用新方法改变了我的例子。
我有这个自定义路由系统,我将在其中获得 路径、控制器、视图 和 areas 从我的 DB 并根据 请求的路径 .
设置它们我现在的问题是,当我尝试访问一个页面时,它给了我 too many redirects response
。
这个区域发生的事情是:
- 用户访问页面并填写表格;
- 使用 AJAX 编辑表单 post,然后从 jquery; 进行重定向
- 用户预约或生成凭证;
如果用户试图通过在浏览器中输入来 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 中(我知道这不是很酷)然后我更改了 Action
和 Controller
的值但是还有什么发生的是 pageList
var 和缓存中的值发生变化,第 203 行。
可能是什么原因造成的?
经过一些研究,我发现我的问题与我没有对来自缓存的值使用 Clone
这一事实有关。由于 .NET 缓存在您获取其值时会保留一个参考值,因此有必要对您从中获取的对象实施 ICloneable
。
因为我只是 "putting" 另一个 var 上的值,后来编辑这个 var 我实际上是在更改缓存上的原始值...因此我得到了一个错误 return 当我再次访问缓存时。
在我的例子中,由于我在我的控制器上进行了一些会话验证,我得到了重定向,第一次(新制作的缓存)我会点击正确的页面。但是在我尝试重新进入同一页面后,我会从中得到不同的值。
为了更正它,我在我的模型上实施了 ICloneable
。如果有人也有这个问题,我也用新方法改变了我的例子。