C#动态站点地图内存泄漏

时间:2012-06-27 18:25:51

标签: c# asp.net c#-4.0 asp.net-4.0 sitemap

我的网站地图的用户控件在ascx中有以下内容:

<asp:SiteMapPath id="SiteMapPath1"runat="server" RenderCurrentNodeAsLink="true" />

在我网站的每个页面上调用此站点地图控件。

后面的用户控制代码:

private void Page_Load(object sender, EventArgs e)
{
    SiteMap.SiteMapResolve += new SiteMapResolveEventHandler(this.ExpandForumPaths);
}
private SiteMapNode ExpandForumPaths(Object sender, SiteMapResolveEventArgs e)
{
    SiteMapNode currentNode = SiteMap.CurrentNode.Clone(true);
    SiteMapNode tempNode = currentNode;

    if (0 != postID)
    {
        tempNode.Url = tempNode.Url + "?PostID=" + postID.ToString();
    }

    if ((null != (tempNode = tempNode.ParentNode)) &&
        (0 != forumID))
    {
        tempNode.Url = tempNode.Url + "?ForumID=" + forumID.ToString();
    }

    if ((null != (tempNode = tempNode.ParentNode)) &&
        (0 != forumGroupID))
    {
        tempNode.Url = tempNode.Url + "?ForumGroupID=" + forumGroupID.ToString();
    }

    return currentNode;
}

问题是它每页负载消耗1 - 2 mb的RAM并且不会释放内存。例如,如果我刷新页面2 mb被添加到w3wp.exe,它会不断增长。

   SiteMap.SiteMapResolve += new SiteMapResolveEventHandler(this.ExpandForumPaths);

我确实认为上面这一行是每次使用我的用户控件时都会创建一个新的事件处理程序引起问题的。

问题此动态站点地图的方法失败。有没有其他方法可以不消耗内存,或者我做错了什么?

3 个答案:

答案 0 :(得分:5)

http://netpl.blogspot.com/2008/04/sitemapresolve-and-dynamic-site-map.html

根据上面的文章,在每个Page_Load上添加一个新的SiteMapResolveEventHandler是因为SiteMapResolve是静态的,似乎是不必要的过多内存分配的一个很好的理由。文章也有一个解决方法。

答案 1 :(得分:2)

您可以将站点地图保存在一个静态缓存中,并仅将当前节点ID存储在用户中。 1-2mb的RAM建议你为每个用户建立一个站点地图(更不用说每个请求了),这似乎有点过分了。

这样的东西
var nodes = Session["ExpandedNodes"] as List<integer>
AddCurrentPageToExpandedNodes(nodes)
var siteMapForUser = StaticSiteMap.Apply(nodes)

答案 2 :(得分:0)

你有没有想过用这行代码删除处理程序

SiteMap.SiteMapResolve -= this.ExpandForumPaths