【问题标题】:Getting StackOverFlow Exception in ASP.NET C#在 ASP.NET C# 中获取 StackOverFlow 异常
【发布时间】: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


【解决方案1】:

假设:

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

然后:

  1. List&lt;StreamUserMenues&gt; menuTree = GetMenuTree(listMenu, "1001");
  2. list.Where(x =&gt; 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
    }
}

【讨论】:

  • 非常感谢! =)。我知道这可能很简单
  • NP。但我建议你将FKStreamIDSteamId重命名为ParentId,将List重命名为Children,这样可以减少进一步调试的错误。
【解决方案2】:

当您使用递归函数时,您必须始终确保有一个基本情况,而事实并非如此。

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

【讨论】:

  • 从技术上讲,这里的基本情况是一个空列表,不会导致递归调用。然而,真正的问题是传递的是原始列表,而不是最终会导致空列表的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
相关资源
最近更新 更多