【发布时间】:2019-11-13 18:25:25
【问题描述】:
所以我在 c# 中创建了一个 HTTP 处理程序 (.ashx.cs),但我不断收到 System.StackOverflowException,它似乎没有告诉我问题出在哪里。我知道通过一些谷歌搜索它告诉我他们有太多的递归调用,但我无法确切地知道我在哪里做这件事。
这是我的处理程序页面;
public void ProcessRequest(HttpContext context)
{
int userID;
userID = Convert.ToInt32(HttpContext.Current.Session["UserID"]);
string streamHash;
streamHash = HttpContext.Current.Session["Stream"].ToString();
int streamID;
streamID = GetStreamID(streamHash);
List<StreamUserMenues> listMenu = new List<StreamUserMenues>();
using (DBEntities contextDB = new DBEntities())
{
var userStreamMenuList = contextDB.StreamMembers.ToList();
foreach (var listItem in userStreamMenuList)
{
StreamUserMenues streamUserMenu = new StreamUserMenues();
streamUserMenu.Id = listItem.StreamMembersID;
streamUserMenu.streamId = listItem.FKStreamID;
streamUserMenu.UserId = listItem.FKUserID;
streamUserMenu.UserNameText = listItem.FKUserID.ToString();
//streamUserMenu.isApproved = (bool) listItem.isUserApproved;
//streamUserMenu.isUserGuest = (bool) listItem.isGuest;
//streamUserMenu.isOnline = (bool) listItem.isUserOnline;
listMenu.Add(streamUserMenu);
}
}
List<StreamUserMenues> menuTree = GetMenuTree(listMenu, streamID);
JavaScriptSerializer js = new JavaScriptSerializer();
context.Response.Write(js.Serialize(menuTree));
}
在处理程序页面上,这是我收到错误的地方;
private List<StreamUserMenues> GetMenuTree(List<StreamUserMenues> list, int streamID)
{
return list.Where(x => x.streamId == streamID).Select(x => new StreamUserMenues()
{
Id = x.Id,
streamId = x.streamId,
UserId = x.UserId,
UserNameText = x.UserId.ToString(),
//isApproved = x.isApproved,
//isUserGuest = x.isUserGuest,
//isOnline = x.isOnline,
List = GetMenuTree(list, x.streamId)
}).ToList();
这是我调用 Handler 的地方;
<script type="text/javascript">
$(document).ready(function () {
$.ajax({
url: 'StreamUserMenuHandler.ashx',
method: 'get',
dataType: 'json',
success: function (data) {
buildMenu($('#menu'), data);
$('#menu').menu();
},
error: function (err) {
alert(err.statusText);
}
});
function buildMenu(parent, items) {
$.each(items, function () {
//var li = $("<li><a href=" + window.location.href + "?StreamHash=" + this.URL + ">" + this.MenuText + "</a></li>");
//var myLink = '<li><a href="' + window.location.href + "'";
//myLink += '?StreamHash=';
var li = $("<li>" + this.UserNameText + "</li>");
if (!this.Active) {
li.addClass('ui-state-disabled');
}
li.appendTo(parent);
if (this.List && this.List.length > 0) {
var ul = $("<ul></ul>");
ul.appendTo(li);
buildMenu(ul, this.List);
}
});
}
});
</script>
我得到的例外是;
System.StackOverflowException
HResult=0x800703E9
Message=Exception of type 'System.StackOverflowException' was thrown.
【问题讨论】:
-
contextDB.StreamMembers中有多少行?如果太多,请使用paging,例如contextDB.StreamMembers.Skip(pageNumber*pageSize).Take(pageSize) -
@Dongdong,contextDB.StreamMembers:/ 一共有6行。我不认为那太大
-
对 GetMenuTree 的递归调用导致异常。递归条件不正确
-
GetMenuTree不能被你的逻辑阻止。 -
大概递归调用应该类似于
GetMenuTree(x.SomeSubList, streamId)。或者至少你不应该用完全相同的列表来调用它。
标签: javascript c# jquery asp.net ajax