2

我对我的站点地图有用户控制,在 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 的内存,并且没有释放内存。例如,如果我刷新页面 2 mb 添加到 w3wp.exe,它会不断增长。

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

我确实相信上面的行是通过每次使用我的用户控件时创建一个新的事件处理程序来导致问题的。

问题这种制作动态站点地图的方法失败了。有没有其他方法可以在不消耗内存的情况下做到这一点,或者我做错了什么?

4

3 回答 3

4

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

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

于 2012-07-11T18:37:57.637 回答
2

您可以将站点地图保存在一个静态缓存中,并且仅针对用户存储当前节点 ID。1-2mb 的 RAM 表明您正在为每个用户(更不用说每个请求)构建一个站点地图,这似乎有点矫枉过正。

就像是

var nodes = Session["ExpandedNodes"] as List<integer>
AddCurrentPageToExpandedNodes(nodes)
var siteMapForUser = StaticSiteMap.Apply(nodes)
于 2012-07-13T15:35:36.870 回答
0

您是否考虑过使用这行代码删除处理程序

SiteMap.SiteMapResolve -= this.ExpandForumPaths
于 2012-07-12T20:27:45.667 回答