Tutorial: Mit SharePoint Webservices arbeiten

Transcription

Tutorial: Mit SharePoint Webservices arbeiten
Tutorial:
Mit SharePoint Webservices arbeiten
Version: 0.1
Autor: Anja Beuth
Inhaltsverzeichnis
1
2
2.1
2.2
2.3
2.3.1
2.3.2
3
3.1
3.1.1
4
4.1
4.2
4.3
Überblick......................................................................................................... 3
Extension erweitern......................................................................................... 3
Webverweis hinzufügen.................................................................................. 3
Code erweitern................................................................................................ 5
Fehlerquellen.................................................................................................. 7
Webservice nicht erreichbar............................................................................ 7
Login am Webserver funktioniert nicht............................................................ 7
Transformationen erweitern............................................................................. 7
Fehlerquellen.................................................................................................. 9
Listenadressierung.......................................................................................... 9
Authentifizierung auslagern............................................................................. 9
web.config anpassen....................................................................................... 10
Modul erweitern............................................................................................... 10
Extension erweitern......................................................................................... 11
Voraussetzungen
Der Entwickler benötigt für dieses Tutorial vollen Webserver-Zugriff. Außerdem muss
Administrator-Zugriff auf den SharePoint Server bzw. auf die SharePoint Installation vorhanden
sein.
Da für die Nutzung der SharePoint Webservices auch Änderungen in SharePoint
vorgenommen werden müssen, sollten Kenntnisse im Umgang mit der Software vorhanden
sein.
Darüber hinaus sollte der Entwickler sich bereits mit der onion.net SharePoint Integration
auseinandergesetzt haben.
Für die grundsätzliche Durchführung wird voraugesetzt, dass im vorliegenden Projekt bereits
ein eigenes Modul bzw. eine eigene Extension eingebunden ist. Darüber hinaus wird
vorausgesetzt, dass die SharePoint Integration korrekt installiert wurde und funktioniert.
Dieses Tutorial gibt keine allgemeine Einführung in SharePoint, SharePoint Webservices,
die onion.net SharePoint Integration oder die Extension-Entwicklung.
Eigene Module und Extensions entwickeln
Übersicht über die vorhandenen SharePoint Webservices
Microsoft Anleitungs-Seite zu SharePoint
Beschreibung
Dieses Tutorial beschreibt die Verwendung von SharePoint Webservices am Beispiel der
Methode "UpdateListItems". Mit dieser Methode können Listen-Elemente in einer
SharePoint-Liste gelöscht oder aktualisiert werden. Außerdem ist das Hinzufügen von neuen
Elementen möglich.
In diesem Tutorial werden Werte aus den Transformationen heraus mit Hilfe der WebServices
als Listen-Element einer SharePoint Liste abgespeichert.
Zeichenerklärung
Text, der grün umrandet und mit dem Pfeil-Symbol gekennzeichnet ist, enthält
konkrete Anweisungen, was als nächstes zu tun ist.
Texte in solchen Kästchen enthalten Tipps und Tricks.
Tutorial: Mit SharePoint Webservices arbeiten
1
Quellcode wird in solch blauen Boxen dargestellt.
Tutorial: Mit SharePoint Webservices arbeiten
2
1 Überblick
1 Überblick
Der Ablauf wird später so sein, dass in den Transformationen eine Extension-Methode
aufgerufen wird. Dabei wird bereits das XML übergeben, was der Webservice später
benötigt. Die Extension-Methode stellt sozusagen nur den Vermittler zwischen
Transformationen und Webservice dar. Sie stellt die Verbindung zum Webservice her
und ruft die Methode mit den entsprechenden Parametern auf. Anschließend werden
eventuelle Fehler geloggt und eine entsprechende Rückmeldung in Form des Textes "success"
oder "error" zurück gegeben, die dann in den Transformationen entsprechend behandelt
werden können.
Der Webservice wirft im Falle eines Fehlers lediglich eine Exception vom Typ
»Microsoft.SharePoint.SoapServer.SoapServerException«. Dies ist nicht sehr aussagekräftig.
In manchen Fällen wird auch keine Exception geworfen, sondern lediglich im Rückgabe-XML
des Webservices auf einen Fehlercode verwiesen. Daher folgt jedem Teil dieses Tutorials
ein Abschnitt "Fehlerquellen", der die häufigsten Probleme und Lösungen bereitstellt. Diese
Abschnitte sind nicht abschließend und werden ggf. stetig erweitert.
2 Extension erweitern
Da wir für die Erweiterung der Transformationen schon genau wissen müssen, was die
Webservice-Methode erwartet, bietet es sich an, zunächst die Extension-Methode zu erstellen,
und sich ein wenig mit dem Webservice vertraut zu machen.
2.1 Webverweis hinzufügen
Um im Visual Studio die Methoden eines Webservices nutzen zu können, muss dieser als
Verweis hinzugefügt werden.
Rechtsklicken Sie auf das Projekt und wählen Sie "Webverweis hinzufügen".
Tutorial: Mit SharePoint Webservices arbeiten
3
2 Extension erweitern
Wenn Sie diesen Eintrag nicht im Kontextmenü haben, wählen Sie stattdessen
"Dienstverweis hinzufügen". Im sich öffnenden Dialog Klicken Sie auf
"Erweitert..." und wählen dort "Webverweis hinzufügen".
Tragen Sie in dem sich öffnenden Dialog die URL zum Webservice ein (in
unserem Fall »http://<Site>/_vti_bin/Lists.asmx«) und vergeben Sie einen Namen,
z.B. "SharepointLists".
Tutorial: Mit SharePoint Webservices arbeiten
4
2 Extension erweitern
Wenn Sie auf den grünen Pfeil klicken, werden die vorhandenen Methoden
aufgelistet.
Nachdem Sie auf "Verweis hinzufügen" geklickt haben, sollte der Websevice im
Projektmappen-Explorer wie folgt angezeigt werden.
2.2 Code erweitern
Um die Methoden des Webservices nutzen zu können, muss zunächst eine entsprechende
Instanz vorhanden sein.
Fügen Sie zunächst die Klasse des gerade eingefügten Webservices zur
Verwendung mit der using-Direktive ein.
using Contoso.Renderengine.SharepointLists;
Tutorial: Mit SharePoint Webservices arbeiten
5
2 Extension erweitern
Dann können wir ein globales Objekt darauf erstellen:
private Lists lists = new Lists();
Da SharePoint mit dem Active Directory der Domäne verknüpft ist, ist in der Regel eine
Anmeldung vonnöten.
Erweitern Sie den Konstruktor der Extension um folgenden Code:
lists.Credentials = new NetworkCredential("username", "password");lists.Url
= "http://www.my-sharepoint.de/_vti_bin/lists.asmx";
Wenn SharePoint auf einem anderen Server läuft als die Render Engine und
die Anmeldedaten ein anderen Domäne zugeordnet sind, muss diese als
dritter Parameter beim Erzeugen der NetworCredentials übergeben werden.
Achtung: Dabei muss immer das Protokoll vorangestellt werden (auch wenn
statt einer lesbaren URL eine IP-Adresse angegeben wird).
Nun können wir eine Extension-Methode hinzufügen, die als der gewünschte Vermittler
gilt.
Fügen Sie dazu folgenden Code hinzu.
[ExtensionMethod(Name = "updateListItems")]
public string UpdateListItems(string listID, XPathNavigator batchXml)
{
try
{
XmlDocument batch = new XmlDocument();
batch.LoadXml(batchXml.InnerXml);
XmlNode updates = batch.SelectSingleNode("Batch");
lists.UpdateListItems(listID, updates);
return "success";
}
Tutorial: Mit SharePoint Webservices arbeiten
6
3 Transformationen erweitern
catch (Exception e)
{
Log.Error(e.Message);
return "error";
}
}
Wir wollen die Webservice-Methode "UpdateListItems()" verwenden. Diese ist in der
Microsoft Library dokumentiert. Die Methode ist für die drei Anwendungsfälle Löschen,
Aktualisieren und Hinzufügen universell verwendbar. Was genau gemacht werden soll,
wird über das "Batch"-XML gesteuert, welches als Parameter übergeben wird. Das sehen
wir uns im nächsten Abschnitt an, da wir es in den Transformationen erstellen wollen.
Bauen Sie im Anschluss daran ein neues Build und aktualisieren Sie die
onion.net Render Engine.
2.3 Fehlerquellen
2.3.1 Webservice nicht erreichbar
Rufen Sie die URL des Webservices lokal im Browser auf. Wenn Sie (ggf. nach einem
Login) die Methoden des Webservices aufgelistet bekommen wissen Sie, dass der
Webservice erreichbar ist.
Bekommen Sie die Methoden nicht aufgelistet, obwohl die Anmeldung und die URL korrekt
sind, muss ggf. in SharePoint noch eine Einstellung nachgezogen oder auf dem Server
ein Port in der Firewall für die Webservices geöffnet werden.
2.3.2 Login am Webserver funktioniert nicht
Prüfen Sie, ob Sie die korrekte Domäne bei der Erzeugung der NetworkCredentials
angegeben haben und ob das Protokoll (z.B. "http") vorangestellt ist. Dies muss auch dann
mit angegeben werden, wenn Sie keine lesbare Webadresse, sondern nur eine IP-Adresse
angeben.
3 Transformationen erweitern
Die Webservice-Methode "UpdateListItems()" benötigt wie gesagt ein XML-Element und
die GUID der SharePoint-Liste, auf die zugegriffen werden soll.
Tutorial: Mit SharePoint Webservices arbeiten
7
3 Transformationen erweitern
Achtung: Hiermit ist nicht der XLink gemeint, sondern wirklich nur die GUID!
X
L
i
n
k
:
sharepoint://list(en,064525c1-007a-47a6-b349-32990e2416ad)@189b38e1-5b2a-49a6-aefd-b601a26e0bee
GUID: 064525c1-007a-47a6-b349-32990e2416ad
In der Microsoft Library ist der mögliche Aufbau des Batch-XMLs ausführlich dokumentiert.
Im Falle einer Produktbewertung könnte es beispielsweise so aussehen:
<Batch OnError="Continue">
<Method ID="1" Cmd="New">
<Field Name="ID">New</Field>
<Field Name="Title">2012-04-05 13:42 Erika Mustermann</Field>
<Field Name="FullName">Erika Mustermann</Field>
<Field Name="Bewertung">5</Field>
<Field Name="Bewertungstext">Super Produkt! Jederzeit wieder! Nur zu
empfehlen!</Field>
</Method>
</Batch>
Die Felder "FullName", "Bewertung" und "Bewertungstext" sind dabei selbst hinzugefügte
Webseitenspalten am Datentyp des Listen-Elements. Als Attribut "Name" muss hier der
SharePoint-interne Name angegeben werden. Dieser kann in SharePoint selbst ermittelt
werden. Eine Alternative ist die onion.net-Datensicht auf SharePoint-Inhalte.
Wenn Sie eine Websitespalte vom Typ "Lookup" mittels des Batch-XML befüllen
wollen, müssen Sie dies nach folgenden Schema aufbauen.
<Field Name="ProductReference" List="{List-GUID der Referenzliste}">{Listen-ID
des jew. Eintrags in der Referenzliste}</Field>
also konkret zum Beispiel:
<Field Name="ProductReference"
List="064525c1-007a-47a6-b349-32990e2416ad">10</Field>
Die Listen-ID des Eintrags ist dabei die eindeutige Nummer des Listeneintrags, auf den
verwiesen werden soll, innerhalb der Liste, in der sich der Eintrag befindet. Diese findet
sich
im
XLink
eines
Listeneintrags.
Für
den
XLink
»sharepoint://listitem(en,064525c1-007a-47a6-b349-32990e2416ad,11)@189b38e1-5b2a-49a6-aefd-b601a26e0bee«
lässt sich ermitteln, dass der Eintrag innerhalb der Liste die ID »11« hat.
Tutorial: Mit SharePoint Webservices arbeiten
8
4 Authentifizierung auslagern
Erzeugen Sie in SharePoint manuell einen Listeneintrag und rufen Sie im Browser
das XML des Eintrags mit der Datensicht "content" auf.
3.1 Fehlerquellen
3.1.1 Listenadressierung
Achten
Sie
darauf,
dass
Sie
wirklich
nur
die
Listen-GUID
(z.B.
»064525c1-007a-47a6-b349-32990e2416ad«) angeben, nicht den XLink (z.B.
»sharepoint://list(en,064525c1-007a-47a6-b349-32990e2416ad)@189b38e1-5b2a-49a6-aefd-b601a26e0bee«).
4 Authentifizierung auslagern
Momentan befinden sich die Informationen für den Verbindungsaufbau zum SharePoint
noch direkt in unserer Extension. Dies ist aus verschiedenen Gründen nicht sehr sinnvoll.
Zum Einen macht es den Code nicht wiederverwendbar. Wenn beispielsweise in der
Vorschau ein anderes SharePoint genutzt werden soll, als Live (um in der Vorschau
produzierte Tests nicht in das produktive SharePoint einfließen zu lassen), so ist dies nicht
ohne weiteres möglich. Es müsste unterschiedliche Extensions oder unterschiedliche
Extension-Methoden für Live und Preview geben.
Darüber hinaus würde eine Änderung der Zugangsdaten, die vielleicht aus
Sicherheitsgründen periodisch alle 3 Monate durchgeführt wird, oder der Umzug des
SharePoint-Systems auf einen anderen Server mit anderer IP-Adresse eine unnötige
Änderung in der Extension bedeuten. Anstatt den Server-Administrator seine administrativen
Tätigkeiten durchführen zu lassen, muss ein Web-Entwickler eine Änderung im Code
durchführen und die Render Engines aktualisieren. Letzteres bringt in der Regel einen
Neustart der Webanwendung mit sich, was im laufenden Betrieb vielleicht nicht zu jeder
Tageszeit erwünscht ist.
Daher wollen wir die Anmeldeinformationen in die web.config-Datei der Render Engine
auslagern.
Spätestens jetzt sollten Sie einen speziellen onion.net-Benutzer anlegen, der
keinen administrativen Zugriff auf das SharePoint hat, da der Zugang ja nun
mehr oder weniger für "jedermann" offengelegt wird, der Zugriff auf die web.config
hat.
Tutorial: Mit SharePoint Webservices arbeiten
9
4 Authentifizierung auslagern
4.1 web.config anpassen
Zunächst wollen wir die Anmeldeinformationen in die web.config einfügen. Ähnlich der
Konfiguration der ImageServer legen wir dafür ein Element unterhalb der Modulkonfiguration
an.
Erweitern Sie die Konfiguration des Projekt-Moduls wie folgt.
<module type="{Projektname}.Renderengine.{Projektname}Module,
{Projektname}.Renderengine">
<sharepoint
uri="http://www.my-sharepoint.de"
username="username"
password="password"
/>
</module>
Wenn benötigt kann auch noch ein Attribut "domain" mit dem entsprechenden Wert
angehangen werden.
4.2 Modul erweitern
Im Modul kann auf die Konfiguration zugegriffen werden. Der Methode "Configure()" wird als
zweiter Parameter ein XMLElement "configuration" übergeben. Dies enthält alles XML,
welches in der Konfiguration innerhalb des <module>-Elements aufgeführt wird. In unserem
Fall also das <sharepoint>-Element.
Wir wollen nun die Attribute unseres neuen Elements <sharepoint> auslesen und an die
Extension übergeben, um sie dort für den Verbindungsaufbau zu verwenden.
Erweitern Sie die Methode Configure() der Klasse "{Projektname}Module" um
folgenden Code.
XmlElement sp = configuration["sharepoint"];
if (sp == null) throw new ConfigurationException("Element 'sharepoint' ist missing",
configuration);
string uri = sp.GetAttribute("uri");
string username = sp.GetAttribute("username");
string pw = sp.GetAttribute("password");
string domain = sp.GetAttribute("domain");
if (String.IsNullOrEmpty(uri) || String.IsNullOrEmpty(username) || String.IsNullOrEmpty(pw))
throw new ConfigurationException("Sharepoint configuration is not correct.", configuration);
extensions = new ContosoExtension(uri, username, pw, domain);
Tutorial: Mit SharePoint Webservices arbeiten
10
4 Authentifizierung auslagern
Zunächst greifen wir konkret auf das <sharepoint>-Element zu. Wenn es nicht da sein
sollte, wird eine entsprechende Exception geworfen.
Im Anschluss daran werden die entsprechenden Attribute ausgelesen und in Variablen
gespeichert. Auch hier werden wieder die benötigten Werte zunächst überprüft und
gegebenenfalls eine Exception geworfen.
Zu guter Letzt werden die Werte beim Erzeugen der Extension mit übergeben.
Sie können auch statt der Exceptions einfach einen entsprechenden Fehler
loggen, falls die Website auch ohne eine korrekte Sharepoint-Anbindung
funktionieren soll.
4.3 Extension erweitern
Die übergebenen Parameter müssen nun im Konstruktur der Extension entgegen genommen
werden.
Erweitern / Verändern Sie den Konstruktor der Extension wie folgt.
public ContosoExtension(string uri, string username, string password, string domain)
{
lists.Credentials = !String.IsNullOrEmpty(domain) ? new NetworkCredential(username,
password, domain) : new NetworkCredential(username, password);
lists.Url = uri + @"/_vti_bin/lists.asmx";
}
In Abhängigkeit davon, ob eine Domain übergeben wird, werden die NetworkCredentials
mit oder ohne diese Domain erzeugt. Die "uri" wird verwendet, um die korrekt URL für den
Zugriff auf den Webservice festzulegen.
Tutorial: Mit SharePoint Webservices arbeiten
11

Documents pareils