2

ascxに次のようなサイトマップのユーザーコントロールがあります。

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

このサイトマップコントロールは、私のWebサイトの各ページで呼び出されます。

そして、背後にあるユーザー制御コード:

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);

上記の行は、ユーザーコントロールが使用されるたびに新しいイベントハンドラーを作成することで問題を引き起こしていると思います。

質問動的サイトマップを作成するためのこの方法は失敗しました。メモリを消費せずにそれを行う他の方法はありますか、それとも私は何か間違ったことをしていますか?

4

3 に答える 3

4

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

上記の記事によると、SiteMapResolveは静的であるため、Page_Loadごとに新しいSiteMapResolveEventHandlerが追加されます。これは、不要な過剰なメモリ割り当ての正当な理由のようです。Articleにも回避策があります。

于 2012-07-11T18:37:57.637 に答える
2

サイトマップを1つの静的キャッシュに保持し、ユーザーに対して現在のノードIDのみを保存することができます。1〜2 MBの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 に答える