在ASP.NET C#中获取StackOverFlow异常



所以我在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();

这就是我呼叫处理程序的地方;

<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.

比方说:

  1. StreamMembers包含5行具有相同的streamId,id为1001

然后:

  1. List<StreamUserMenues> menuTree = GetMenuTree(listMenu, "1001")
  2. list.Where(x => x.streamId == 1001)将得到5行
  3. List = GetMenuTree(list, "1001")将一次又一次地给出5行,无穷无尽

我相信你的StreamMember.FKStreamID是一个指向StreamMember.StreamMembersID的FK,所以你的逻辑应该是:

private List<StreamUserMenues> GetMenuTree(List<StreamUserMenues> list, int streamID)
{
return list.Where(x => x.streamId == streamID).Select(x => new StreamUserMenues() 
{
.....
List = GetMenuTree(list, x.Id) //be aware: it's x.Id, not x.streamId
}
}

当您使用递归函数时,您必须始终确保有一个基本情况,而它并不认为是这样。

在我看来,你只是一遍又一遍地传递相同的列表和id,这会导致你的程序抛出错误。

最新更新