So I have created an HTTP Handler (.ashx.cs) in c# and I am constantly getting a System.StackOverflowException, it doesn't seem to tell me where the problem lies. I understand that with some google search it tells me theirs too many recursive calls, but I cannot find out exactly where I am doing this.
Here is my Handler Page;
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));
}
On the handler page, this is where I am getting an error;
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();
This is where I am calling the 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>
The Exception that I am getting is;
System.StackOverflowException
HResult=0x800703E9
Message=Exception of type 'System.StackOverflowException' was thrown.
contextDB.StreamMembers? if it's too many, usepaging, likecontextDB.StreamMembers.Skip(pageNumber*pageSize).Take(pageSize)GetMenuTreecannot stop by your logic.GetMenuTree(x.SomeSubList, streamId). Or at the very least you shouldn't be calling it with the exact same list.