1


2 つの異なる管理パス (部門とオフィス) の下に多数のサイト コレクションを持つ SharePoint Web アプリケーションがあります。

http://sharepoint.abc/depts/finance
http://sharepoint.abc/depts/isg
http://sharepoint.abc/offices/boston
http://sharepoint.abc/offices/chicago

ユーザーがログインすると、WebPart にある次の c# コードを使用して読み取りアクセス権を持つサイト コレクションのリストが表示されます。

 SPSecurity.RunWithElevatedPrivileges(delegate()
    {
        using (SPSite spSite = new SPSite(SPContext.Current.Site.Url))
        {
            foreach (SPSite site in spSite.WebApplication.Sites)
            {
                try
                {
                    var rootWeb = site.RootWeb;
                    if (rootWeb.DoesUserHavePermissions(SPContext.Current.Web.CurrentUser.LoginName, SPBasePermissions.ViewPages))
                    {
                        if (this.ValidSite(rootWeb.Url))
                        {
                            string url = GetRelativePath(rootWeb.Url);
                            allowedSites.Add(new SiteInfo(rootWeb.Title, url));
                        }
                    }
                }
                catch (Exception ex)
                {
                    this.Controls.Add(new LiteralControl("<br/>GetAllowedSites Error: " + ex.Message));
                }
            }

        }
    });

正常に動作しますが、実稼働環境では Web パーツの読み込みに 20 秒かかります (2 つのパスに 700 のサイト コレクションがあります)。

サイトのリストを保持するためにキャッシュを使用しましたが、キャッシュの有効期限が切れると、それ自体を再生成するのに 20 秒かかります。

理想的には、ユーザーがアクセスできるかどうかを確認するためにすべてのサイト コレクションを反復処理するのではなく、ユーザーを使用してユーザーがアクセスできるサイト コレクションを確認することです。これは達成できますか?

ありがとう

イーグス

4

1 に答える 1

0

SPWeb.GetSubwebsForCurrentUserメソッドを使用して、現在のユーザーがメンバーになっている現在の Web サイトの下にあるサブサイトを取得してみてください。

于 2013-11-04T12:10:44.847 に答える