Beispiel für die Bereitstellung einer Konsolenanwendung

Im Office 365-Entwicklungsmuster und -übungen (PnP)-Programm wurde zur Unterstützung der neuen Add-In-Modells ein Bereitstellungframework eingeführt, mit dem Benutzer Folgendes ausführen können:

  • Erstellen von benutzerdefinierten Websitevorlagen durch einfaches Zeigen auf ein Websitemodell.
  • Speichern des Modells als Bereitstellungsvorlage.
  • Anwenden der benutzerdefinierten Vorlage auf vorhandene Websitesammlungen nach Bedarf.

Hinweis

Das PnP-Bereitstellungsframework & PnP-Bereitstellungsmodul sind Open-Source-Lösungen mit aktiver Community, die unterstützung dafür bereitstellt. Es gibt keine SLA für den Support des Open-Source-Tools durch Microsoft.

In diesem Beispiel erstellen wir eine grundlegende Konsolenanwendung, die Klassen in der PnP-Kernbereitstellungsbibliothek implementiert, um dem PnP-Bereitstellungsmodul die Ausführung folgender wesentlicher Bereitstellungsaufgaben zu ermöglichen:

  • Entwerfen und Modellieren Ihrer Websiteanpassung. Dies kann ein neues Websitedesign sein, oder Sie können auf eine vorhandene Website zeigen und diese als Bereitstellungsvorlage speichern.
  • Speichern und Beibehalten des Websitemodells als Bereitstellungsvorlage, sodass Sie es erneut verwenden können.
  • Anwenden der Bereitstellungsvorlage auf eine neue oder vorhandene Websitesammlung.

Hinweis

Diese exemplarische Vorgehensweise ist eine Ergänzung zu einem Beispiel, das derzeit auf GitHub unter Erste Schritte mit dem PnP-Bereitstellungsmodul verfügbar ist. Der Code (Program.cs) und die Lösungsdateien für das Beispiel stehen zum Download zur Verfügung. Zudem gibt es eine 20 Minuten dauernde Videopräsentation des Vorgangs (mit geringfügig anderem Code) auf der Microsoft Channel 9-Website: Erste Schritte mit dem PnP-Bereitstellungsmodul.

Erstellen und Vorbereiten eines Visual Studio-Projekts

Erstellen Sie zuerst ein Visual Studio-Projekt. In diesem Beispiel erstellen wir zur Vereinfachung eine grundlegende Konsolenanwendung, die das PnP-Bereitstellungsmodul mithilfe der PnP-Kernbibliothek des Bereitstellungsframeworks implementiert. Um die Beispiellösung zu unterstützen, müssen wir jedoch das Bereitstellungsframework für die PnP-Kernbibliothek herunterladen und installieren.

  1. Öffnen Sie Visual Studio, und wählen Sie dann Datei>Neu>Projekt.

  2. Wählen Sie im Assistenten für neue Projekte Visual C# und dann Konsolenanwendung aus.

  3. Nennen Sie das Projekt Programm, und wählen Sie dann OK. (Sie können das Projekt beliebig benennen, aber bedenken Sie, dass in dieser exemplarischen Vorgehensweise der Projektname Programm verwendet wird.)

  4. Laden Sie die PnP Core-Bibliothek herunter, die als NuGet-Paket unter Microsoft Office SharePoint Online PnPCore-Pakete verfügbar ist, und installieren Sie sie.

    Hinweis

    Es sind drei Versionen der Bibliothek verfügbar. Eine Version ist die SharePointPnPCoreOnline-Bibliothek, die für SharePoint Online und Office 365 gedacht ist. Die anderen Versionen sind SharePointPnPCore2013 and SharePointPnPCore2016, die für lokale SharePoint 2013- bzw. SharePoint 2016-Versionen bestimmt sind.

  5. Installieren Sie den NuGet-Client, indem Sie zum NuGet-Clientinstallationsprogramm wechseln.

  6. Nachdem der NuGet-Client installiert wurde, führen Sie den NuGet-Paket-Manager aus. Klicken Sie mit der rechten Maustaste auf den Verweise-Knoten im Visual Studio Projektmappen-Explorer, und wählen Sie dann NuGet-Pakete verwalten aus.

  7. Wählen Sie im Paket-Manager Durchsuchen, und geben Sie dann den Suchbegriff SharePoint PnP ein, um die SharePointPnPCoreOnline-Bibliothek verfügbar zu machen.

  8. Führen Sie die Anweisungen zum Herunterladen und Installieren der SharePointPnPCoreOnline-Bibliothek aus.

    Nachdem in Ihrem Visual Studio-Projekt auf die PnP-Kernbibliothek verwiesen wird, stehen Ihnen alle Bibliotheksmitglieder als Erweiterungsmethoden in vorhandenen Objektinstanzen, z. B. Web- und Liste-Instanzen, zur Verfügung.

  9. Stellen Sie sicher, dass Ihre Datei Program.cs die folgenden using-Anweisungen enthält.

    using Microsoft.SharePoint.Client;
    using OfficeDevPnP.Core.Framework.Provisioning.Connectors;
    using OfficeDevPnP.Core.Framework.Provisioning.Model;
    using OfficeDevPnP.Core.Framework.Provisioning.ObjectHandlers;
    using OfficeDevPnP.Core.Framework.Provisioning.Providers.Xml;
    using System;
    using System.Net;
    using System.Security;
    using System.Threading;
    

Erstellen, Extrahieren und Beibehalten der Bereitstellungsvorlage

Nachdem Ihr Projekt eingerichtet wurde, können Sie Ihre Websiteanpassungen erstellen. Sie können dies manuell vornehmen oder indem Sie auf eine Website verweisen, deren Entwurf Sie verwenden möchten. Speichern Sie einfach das ausgewählte Websitedesign als Bereitstellungsvorlage, oder verwenden Sie eine Kombination aus beiden Ansätzen. Für dieses Beispiel verweisen wir einfach auf eine vorhandene Website und speichern ihre Darstellung und die Websiteartefakte (aber nicht den Inhalt) als Bereitstellungsvorlage.

Zunächst müssen wir eine Verbindung mit der Website herstellen, die wir als Bereitstellungsvorlage modellieren möchten. Beginnen wir mit dem Erfassen von Verbindungsinformationen, einschließlich des Benutzernamens, des Kennworts und der Quell-URL.

  1. Sammeln Sie Verbindungsinformationen vom Benutzer. In der Main-Programmroutine führen wir drei einfache Dinge aus: Verbindungsinformationen sammeln, die Bereitstellungsvorlage ABRUFEN und die Bereitstellungsvorlage ANWENDEN. Die Hauptaufgaben erledigen die Methoden GetProvisioningTemplate und ApplyProvisioningTemplate, die wir als Nächstes definieren.

    static void Main(string[] args)
    {
      ConsoleColor defaultForeground = Console.ForegroundColor;
    
      // Collect information
      string templateWebUrl = GetInput("Enter the URL of the template site: ", false, defaultForeground);
      string targetWebUrl = GetInput("Enter the URL of the target site: ", false, defaultForeground);
      string userName = GetInput("Enter your user name:", false, defaultForeground);
      string pwdS = GetInput("Enter your password:", true, defaultForeground);
      SecureString pwd = new SecureString();
      foreach (char c in pwdS.ToCharArray()) pwd.AppendChar(c);
    
      // GET the template from existing site and serialize
      // Serializing the template for later reuse is optional
      ProvisioningTemplate template = GetProvisioningTemplate(defaultForeground, templateWebUrl, userName, pwd);
    
      // APPLY the template to new site from
      ApplyProvisioningTemplate(targetWebUrl, userName, pwd, template);
    
      // Pause and modify the UI to indicate that the operation is complete
      Console.ForegroundColor = ConsoleColor.White;
      Console.WriteLine("We're done. Press Enter to continue.");
      Console.ReadLine();
    }
    
  2. Erstellen und verwenden Sie eine private GetInput-Methode, um die erforderlichen Anmeldeinformationen abzurufen.

    private static string GetInput(string label, bool isPassword, ConsoleColor defaultForeground)
    {
      Console.ForegroundColor = ConsoleColor.Green;
      Console.WriteLine("{0} : ", label);
      Console.ForegroundColor = defaultForeground;
    
      string value = "";
    
      for (ConsoleKeyInfo keyInfo = Console.ReadKey(true); keyInfo.Key != ConsoleKey.Enter; keyInfo = Console.ReadKey(true))
      {
        if (keyInfo.Key == ConsoleKey.Backspace)
        {
          if (value.Length > 0)
          {
            value = value.Remove(value.Length - 1);
            Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop);
            Console.Write(" ");
            Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop);
          }
        }
        else if (keyInfo.Key != ConsoleKey.Enter)
        {
          if (isPassword)
          {
            Console.Write("*");
          }
          else
          {
            Console.Write(keyInfo.KeyChar);
          }
          value += keyInfo.KeyChar;
        }
      }
      Console.WriteLine("");
    
      return value;
    }
    
  3. Verweisen Sie auf die Website, die das Modell für unsere Bereitstellungsvorlage darstellt. Während GET auf der Quellwebsite mit einer einzigen Codezeile ausgeführt wird, sehen Sie sich GetProvisioningTemplate() an, das die von uns definierte GET-Methode ist.

    private static ProvisioningTemplate GetProvisioningTemplate(ConsoleColor defaultForeground, string webUrl, string userName, SecureString pwd)
    {
      using (var ctx = new ClientContext(webUrl))
      {
        // ctx.Credentials = new NetworkCredentials(userName, pwd);
        ctx.Credentials = new SharePointOnlineCredentials(userName, pwd);
        ctx.RequestTimeout = Timeout.Infinite;
    
        // Just to output the site details
        Web web = ctx.Web;
        ctx.Load(web, w => w.Title);
        ctx.ExecuteQueryRetry();
    
        Console.ForegroundColor = ConsoleColor.White;
        Console.WriteLine("Your site title is:" + ctx.Web.Title);
        Console.ForegroundColor = defaultForeground;
    
        ProvisioningTemplateCreationInformation ptci
                = new ProvisioningTemplateCreationInformation(ctx.Web);
    
        // Create FileSystemConnector to store a temporary copy of the template
        ptci.FileConnector = new FileSystemConnector(@"c:\temp\pnpprovisioningdemo", "");
        ptci.PersistComposedLookFiles = true;
        ptci.ProgressDelegate = delegate(String message, Int32 progress, Int32 total)
        {
            // Only to output progress for console UI
            Console.WriteLine("{0:00}/{1:00} - {2}", progress, total, message);
        };
    
        // Execute actual extraction of the template
        ProvisioningTemplate template = ctx.Web.GetProvisioningTemplate(ptci);
    
        // We can serialize this template to save and reuse it
        // Optional step
        XMLTemplateProvider provider =
                new XMLFileSystemTemplateProvider(@"c:\temp\pnpprovisioningdemo", "");
        provider.SaveAs(template, "PnPProvisioningDemo.xml");
    
        return template;
      }
    }
    

    Im vorherigen Codeausschnitt haben wir auch eine ProvisioningTemplateCreationInformation-Variable pcti definiert. Die Variable ermöglicht es uns, Informationen über Artefakte zu speichern, die wir zusammen mit der Vorlage speichern können.

  4. Erstellen Sie ein Dateisystem-Connector-Objekt, damit wir eine temporäre Kopie der Bereitstellungsvorlage speichern können, die wir auf eine andere Website anwenden möchten.

    Hinweis

    Dieser Schritt ist optional. Es ist nicht erforderlich, dass Sie die Bereitstellungsvorlage in XML serialisieren. Zu diesem Zeitpunkt ist die Vorlage einfach C#-Code. Die Serialisierung ist nicht nur optional, sondern Sie können auch jedes beliebige Serialisierungsformat verwenden.

  5. Führen Sie die Extraktion der Bereitstellungsvorlage mit dieser einzelnen Codezeile aus:

    ProvisioningTemplate template = ctx.Web.GetProvisioningTemplate(ptci);
    
  6. (Optional) Sichern und speichern Sie eine serialisierte Version der Bereitstellungsvorlage, sodass Sie sie erneut verwenden können. Sie können die Bereitstellungsvorlage in jedem beliebigen Format serialisieren. In diesem Beispiel haben wir sie in eine XML-Datei namens PnPProvisioningDemo.xml serialisiert. Die Datei selbst ist ein XMLFileSystemTemplateProvider-Objekt, für das wir einen Speicherort im Dateisystem bereitgestellt haben.

Anwenden der Bereitstellungsvorlage auf eine neue oder vorhandene Website

Nachdem wir die Bereitstellungsvorlage extrahiert, gesichert und gespeichert haben, ist der nächste und letzte Schritt, die Bereitstellungsvorlage mithilfe der ApplyProvisioningTemplate-Methode auf eine neue SharePoint-Websitesammlung anzuwenden.

  1. Rufen Sie die Anmeldeinformationen für die Zielwebsite ab.

    // ctx.Credentials = new NetworkCredentials(userName, pwd);
    ctx.Credentials = new SharePointOnlineCredentials(userName, pwd);
    ctx.RequestTimeout = Timeout.Infinite;
    
  2. Erfassen Sie Websiteartefakte, die mit der ProvisioningTemplateCreationInformation-Methode mithilfe der Ergänzungsmethode ProvisioningTemplateApplyingInformation gespeichert wurden.

    ProvisioningTemplateApplyingInformation ptai = new ProvisioningTemplateApplyingInformation();
    ptai.ProgressDelegate = delegate(String message, Int32 progress, Int32 total)
    {
      Console.WriteLine("{0:00}/{1:00} - {2}", progress, total, message);
    };
    
  3. Rufen Sie eine Zuordnung zum Dateiconnector für die Ressourcen ab.

    // Associate file connector for assets
    FileSystemConnector connector = new FileSystemConnector(@"c:\temp\pnpprovisioningdemo", "");
    template.Connector = connector;
    
  4. (Optional) Da die Bereitstellungsvorlage eine Objektinstanz ist, können wir Code schreiben, um Websiteaartefakte schnell und einfach anzupassen. In diesem Fall fügen wir eine neue Kontaktliste hinzu.

    // Because the template is actual object, we can modify this using code as needed
    template.Lists.Add(new ListInstance()
    {
      Title = "PnP Sample Contacts",
      Url = "lists/PnPContacts",
      TemplateType = (Int32)ListTemplateType.Contacts,
      EnableAttachments = true
    });
    
  5. Wenden Sie die Bereitstellungsvorlage auf die neue Website an, wiederum mit einer einzelnen Codezeile.

    web.ApplyProvisioningTemplate(template, ptai);
    
  6. Die vollständige Implementierung der ApplyProvisioningTemplate()-Methode ist unten dargestellt.

    private static void ApplyProvisioningTemplate(string targetWebUrl, string userName, SecureString pwd, ProvisioningTemplate template)
    {
      using (var ctx = new ClientContext(targetWebUrl))
      {
        // ctx.Credentials = new NetworkCredentials(userName, pwd);
        ctx.Credentials = new SharePointOnlineCredentials(userName, pwd);
        ctx.RequestTimeout = Timeout.Infinite;
    
        Web web = ctx.Web;
    
        ProvisioningTemplateApplyingInformation ptai = new ProvisioningTemplateApplyingInformation();
        ptai.ProgressDelegate = delegate (String message, Int32 progress, Int32 total)
        {
          Console.WriteLine("{0:00}/{1:00} - {2}", progress, total, message);
        };
    
        // Associate file connector for assets
        FileSystemConnector connector = new FileSystemConnector(@"c:\temp\pnpprovisioningdemo", "");
        template.Connector = connector;
    
        // Because the template is actual object, we can modify this using code as needed
        template.Lists.Add(new ListInstance()
        {
          Title = "PnP Sample Contacts",
          Url = "lists/PnPContacts",
          TemplateType = (Int32)ListTemplateType.Contacts,
          EnableAttachments = true
        });
    
        web.ApplyProvisioningTemplate(template, ptai);
      }
    }
    

Siehe auch