3

ユーザーのコメントを取得してカスタムリストに保存するWebパーツを作成しようとしています。このコードを記述して、Webパーツがページに追加されたら、サイトにリストを追加します。

[Guid("c314a0e8-0210-4064-b79e-bfd3594c6083")]
public class CommentWriteSpace : System.Web.UI.WebControls.WebParts.WebPart
{
    SPSite site = null;
    SPWeb web = null;

    public CommentWriteSpace()
    {
        SPSecurity.CodeToRunElevated foo = new SPSecurity.CodeToRunElevated(doit);

        SPSecurity.RunWithElevatedPrivileges(foo);
        SPListCollection listCollection = web.Lists;

        Guid listGuid = listCollection.Add("Comments List", "A list of user comments", SPListTemplateType.GenericList);
        listCollection[listGuid].Fields.Add("User", SPFieldType.User, true);
        listCollection[listGuid].Fields.Add("Comment", SPFieldType.Text, true);
        listCollection[listGuid].OnQuickLaunch = true;
        listCollection[listGuid].Update();
        //this.Page.Request.Url.ToString()
    }

    public void doit()
    {
        site = SPContext.Current.Site;
        web = site.OpenWeb();
    }
}

しかし、RunWithElevatedPrivilegesメソッドは例外をスローします。これはアクセス許可の問題だと思います。例外は、site.OpenWeb();特権を昇格せずにメソッドを実行したときに表示されるものと同じです。

何が問題なのですか?

4

4 に答える 4

4

多くの問題が発生しています。

  1. SPSiteオブジェクトのアクセス許可は作成時に決定されるためSPContext.Current.Site、内で参照を取得した場合でも、現在のユーザーのアクセス許可がすでに付与されていますRWEP
  2. ブロックからSPオブジェクトを渡すことRWEPはサポートされておらず、一般的に危険です。RWEPを使用する必要がある場合は、そのコンテキスト内で作成されたすべてSPSiteSPWebオブジェクト(およびその子)を使用して、で破棄する必要がありますCodeToRunElevated
  3. を呼び出すたびlistCollection[listGuid]に新しいSPListオブジェクトが作成され、予期しない動作が発生する可能性があります。

ダンが示唆しているように、RWEPはあなたが達成しようとしていることを行うための好ましい方法ではありません。彼が参照しているリンクの拡張機能を使用して、次のように書き直します。

[Guid("c314a0e8-0210-4064-b79e-bfd3594c6083")]
public class CommentWriteSpace : System.Web.UI.WebControls.WebParts.WebPart
{
    public CommentWriteSpace()
    {
        SPContext.Current.Site.RunAsSystem(UpdateSite);
        //this.Page.Request.Url.ToString()
    }

    public void UpdateSite(SPSite site)
    {
        SPWeb web = site.RootWeb;

        SPListCollection listCollection = web.Lists;
        Guid listGuid = listCollection.Add("Comments List", "A list of user comments", SPListTemplateType.GenericList);
        SPList list = listCollection[listGuid];

        list.Fields.Add("User", SPFieldType.User, true);
        list.Fields.Add("Comment", SPFieldType.Text, true);
        list.OnQuickLaunch = true;
        list.Update();
    }
}
于 2009-03-12T22:45:17.397 に答える
2

昇格された特権で SPContext.Current.Site を実行する必要はありません。実際、これが例外を受け取る理由だと思います。さらに、site.OpenWeb() の代わりに SPContext.Current.Web を使用することもできます。後者は、再度破棄する必要がある新しい SPWeb オブジェクトを作成します。SPContext からの SPSite および SPWeb オブジェクトは、HTTP 要求が完了すると自動的に破棄されます。

于 2009-03-12T17:38:53.233 に答える
1

SharePoint オブジェクトとやり取りするときは、RunWithElevatedPrivileges を使用しないことをお勧めします (例のように、可能な限り)。その使用は、SharePoint 外のリソース (データベース、ファイル共有など) にアクセスする必要がある場合に限定する必要があります。

これは、SharePoint コンテキスト内で昇格された特権を取得するための非常にエレガントなアプローチを提供する優れた記事です: http://solutionizing.net/2009/01/06/elegant-spsite-elevation/

于 2009-03-12T18:20:55.503 に答える
0

うーん。コードの大部分を匿名デリゲートで実行する方が簡単でしょうか?

SPSecurity.RunWithElevatedPrivileges(delegate()
{
  // Your code here
}

コレクションに繰り返しアクセスするよりも、SPList オブジェクトを作成する方がよいでしょう。これらのコレクションの中には、少し奇妙な動作をするものがあります。GUID/インデックスを介してアクセスするたびに、SPViewCollection が新しいオブジェクトを作成していると思います。

そのすべての質問、私はLarsに同意します-SPContext.Current.Webを使用してください

于 2009-03-12T17:49:41.680 に答える