1

デリゲートを使用して SharePoint サイトのマスター ページを更新するメソッドがあります。これが必要な理由については詳しく説明しませんが、プロセスの次のステップに進む前に、メソッド全体が同期的に実行されるようにする必要があります。

これどうやってするの?

コードは次のようになります。

[DataContract]
public class CustomerPortalBasicSiteProvider : AbstractProvider<bool>, IExecutable
{
    public CustomerPortalBasicSiteProvider()
    {
    }

    List<IProviderSetting> Settings { get; set; }

    public bool Execute(ExecuteParams parameters)
    {
        SetMasterPage(parameters);
        return true;
    }

    private void SetMasterPage(ExecuteParams parameters)
    {
        // NOTE: I need the contents of this method to run synchronously
        SPSecurity.RunWithElevatedPrivileges(
           delegate
           {
               using (var elevatedSite = new SPSite(parameters.SiteUrl))
               {
                   using (var elevatedWeb = elevatedSite.OpenWeb())
                   {
                       elevatedWeb.AllowUnsafeUpdates = true;
                       elevatedWeb.CustomMasterUrl = Settings.Find(x => x.Key == "SPWeb.CustomMasterUrl").Value;
                       elevatedWeb.Update();
                       elevatedWeb.AllowUnsafeUpdates = false;
                   }
               }
           });
    }
}

更新: SharePoint オブジェクトは次のようになります:

public static class SPSecurity
{
    public static AuthenticationMode AuthenticationMode { get; }
    public static bool CatchAccessDeniedException { get; set; }
    public static bool WebConfigAllowsAnonymous { get; }

    public static void RunWithElevatedPrivileges(SPSecurity.CodeToRunElevated secureCode);
    [Obsolete("Use SetApplicationCredentialKey method instead.")]
    public static void SetApplicationCendentialKey(SecureString password);
    public static void SetApplicationCredentialKey(SecureString password);

    public delegate void CodeToRunElevated();

    public class SuppressAccessDeniedRedirectInScope : IDisposable
    {
        public SuppressAccessDeniedRedirectInScope();

        public void Dispose();
    }
}
4

1 に答える 1

3

私の経験から、RunWithElevatedPrivileges はデリゲートを同期的に実行します。デリゲートは、別のセキュリティ コンテキストでコードを実行する場合にのみ必要です。念のため、デリゲート コードの最後に、RunWithElevatedPrivileges の呼び出し後の最初のコードとして、ログ メッセージを書き込むことができます。後者がログ ファイルの最初にある場合、RunWithElevatedPrivileges は非同期で実行されます。

于 2013-10-28T13:04:00.680 に答える