wake-up-neo.com

Wie verwende ich den Sharepoint-Webdienst, um eine Liste von Dokumenten von .NET zu erhalten

Technologien: Winforms, .NET, C #, Sharepoint-Webdienste

Ich schreibe gerade eine Winform-Desktopanwendung, die auf eine bestimmte Liste von Sharepoint-Dokumenten und benutzerdefinierten Eingabevariablen zugreifen soll (aus einer Sharepoint-Dokumentbibliothek).

http://www.infoq.com/articles/swanson-moss-web-services

Diese Website vermittelte mir einen guten Überblick darüber, welche Webdienste verfügbar sind, aber ich kann nicht herausfinden, wie ich darauf zugreifen kann, was ich möchte.

Verwenden der website.com/_vti_bin/Lists.asmx und website.com/_vti_bin/Dws.asmx als Webreferenzen.

com.website.Lists splist = new Project.com.website.Lists();
com.website1.Dws spData = new Project.com.website1.Dws();

splist.Credentials = new NetworkCredential("username", "password", "domain");
splist.GetList("My_list");

Dies war mein erster Verbindungsversuch und es gibt mir eine SOAPException (das ist der Umfang der Details, die ich geben kann)

Ich bin nicht sicher, ob dies erforderlich ist, aber es gibt mehr als eine Sharepoint-Website, die auf "website.com" gehostet wird.

Ich versuche nur herauszufinden, ob ich bei der Verwendung dieses Dienstes auf dem richtigen Weg bin oder ob ich alles falsch verstanden habe

EDIT 1: die ursprüngliche Frage verlassen, damit die Leute verstehen, was los ist.

@CBono: Der Artikel, den Sie verlinkt haben, war eine große Hilfe für den Einstieg. (Ich kann es noch nicht bestätigen :() Ich habe es geschafft, die Liste abzurufen, aber das Formatieren oder AT der Daten erweist sich als schwierig .

query.InnerXml = "<Where><Gt><FieldRef Name=\"ID\" />" + "<Value Type=\"Counter\">3</Value></Gt></Where>";
viewFields.InnerXml = "<FieldRef Name=\"Title\" />"; 
queryOptions.InnerXml = "";

Meine Ergebnisse sehen jedoch so aus:

<rs:data ItemCount="4" xmlns:rs="urn:schemas-Microsoft-com:rowset">
     <z:row ows_Title="" ows_Deal_x0020_ID="4055.00000000000" ows_MetaInfo="8;#Subject:SW| Deal ID:DW|4055.00000000000 vti_parserversion:SR|12.0.0.6545 _Category:SW| SVP Approved?:IW|1 vti_author:SR|DD\\admin vti_approvallevel:SR| vti_categories:VW| vti_modifiedby:SR|DD\\admin vti_assignedto:SR| Keywords:SW| vti_cachedcustomprops:VX|vti_approvallevel vti_categories Subject Deal\\ ID vti_assignedto Keywords vti_title _Author _Category Quarter-End\\ Date ContentType SVP\\ Approved? _Comments ContentTypeId:SW|0x0101004E1C496569BCDF42912D848E8085351A ContentType:SW|Document vti_cachedtitle:SR| vti_title:SR| _Author:SW| Quarter-End Date:SW|2008-10-31T00:00:00Z _Comments:SW| " ows__ModerationStatus="0" ows__Level="1" ows_Last_x0020_Modified="8;#2011-07-04 16:21:56" ows_Quarter_x002d_End_x0020_Date="2008-10-31 00:00:00" ows_ID="8" ows_owshiddenversion="3" ows_UniqueId="8;#{6594AD67-6954-4641-BDA5-8FECEDCCEAD8}" ows_FSObjType="8;#0" ows_Created_x0020_Date="8;#2011-07-04 16:20:00" ows_ProgId="8;#" ows_FileLeafRef="8;#Deal Name Q1.doc" ows_Modified="2011-07-04 16:21:55" ows_FileRef="8;#sites/site1/deals/Deal Name Q1.doc" ows_DocIcon="doc" ows_Editor="605;#Doe, John" xmlns:z="#RowsetSchema" />
     <z:row ows_Title="" ows_Deal_x0020_ID="4576.00000000000" ows_MetaInfo="9;#Subject:SW| Deal ID:DW|4576.00000000000 vti_parserversion:SR|12.0.0.6545 _Category:SW| SVP Approved?:IW|1 vti_author:SR|DD\\admin vti_approvallevel:SR| vti_categories:VW| vti_modifiedby:SR|DD\\admin vti_assignedto:SR| Keywords:SW| vti_cachedcustomprops:VX|vti_approvallevel vti_categories Subject Deal\\ ID vti_assignedto Keywords vti_title _Author _Category Quarter-End\\ Date ContentType SVP\\ Approved? _Comments ContentTypeId:SW|0x0101004E1C496569BCDF42912D848E8085351A ContentType:SW|Document vti_cachedtitle:SR| vti_title:SR| _Author:SW| Quarter-End Date:SW|2011-01-31T00:00:00Z _Comments:SW| " ows__ModerationStatus="0" ows__Level="1" ows_Last_x0020_Modified="9;#2011-07-04 16:22:37" ows_Quarter_x002d_End_x0020_Date="2011-01-31 00:00:00" ows_ID="9" ows_owshiddenversion="3" ows_UniqueId="9;#{0AD9B000-3736-4B7B-9182-57C270824B8A}" ows_FSObjType="9;#0" ows_Created_x0020_Date="9;#2011-07-04 16:22:08" ows_ProgId="9;#" ows_FileLeafRef="9;#Deal Name Q4.doc" ows_Modified="2011-07-04 16:22:37" ows_FileRef="9;#sites/site1/deals/Deal Name Q4.doc" ows_DocIcon="doc" ows_Editor="605;#Doe, John" xmlns:z="#RowsetSchema" />
     <z:row ows_Title="" ows_Deal_x0020_ID="80003.0000000000" ows_MetaInfo="10;#Subject:SW| Deal ID:DW|80003.0000000000 vti_parserversion:SR|12.0.0.6545 _Category:SW| SVP Approved?:IW|0 vti_author:SR|DD\\admin vti_approvallevel:SR| vti_categories:VW| vti_modifiedby:SR|DD\\admin vti_assignedto:SR| Keywords:SW| vti_cachedcustomprops:VX|vti_approvallevel vti_categories Subject Deal\\ ID vti_assignedto Keywords vti_title _Author _Category Quarter-End\\ Date ContentType SVP\\ Approved? _Comments ContentTypeId:SW|0x0101004E1C496569BCDF42912D848E8085351A ContentType:SW|Document vti_cachedtitle:SR| vti_title:SR| _Author:SW| Quarter-End Date:SW|2011-01-31T00:00:00Z _Comments:SW| " ows__ModerationStatus="0" ows__Level="1" ows_Last_x0020_Modified="10;#2011-07-04 16:23:15" ows_Quarter_x002d_End_x0020_Date="2011-01-31 00:00:00" ows_ID="10" ows_owshiddenversion="3" ows_UniqueId="10;#{07543C39-F299-4085-82CE-F059257796EA}" ows_FSObjType="10;#0" ows_Created_x0020_Date="10;#2011-07-04 16:22:56" ows_ProgId="10;#" ows_FileLeafRef="10;#Deal Name Q3.doc" ows_Modified="2011-07-04 16:23:15" ows_FileRef="10;#sites/site1/deals/Deal Name Q3.doc" ows_DocIcon="doc" ows_Editor="605;#Doe, John" xmlns:z="#RowsetSchema" />
     <z:row ows_Title="" ows_Deal_x0020_ID="3319.00000000000" ows_MetaInfo="11;#Subject:SW| Deal ID:DW|3319.00000000000 vti_parserversion:SR|12.0.0.6545 _Category:SW| SVP Approved?:IW|1 vti_author:SR|DD\\admin vti_approvallevel:SR| vti_categories:VW| vti_modifiedby:SR|DD\\admin vti_assignedto:SR| Keywords:SW| vti_cachedcustomprops:VX|vti_approvallevel vti_categories Subject Deal\\ ID vti_assignedto Keywords vti_title _Author _Category Quarter-End\\ Date ContentType SVP\\ Approved? _Comments ContentTypeId:SW|0x0101004E1C496569BCDF42912D848E8085351A ContentType:SW|Document vti_cachedtitle:SR| vti_title:SR| _Author:SW| Quarter-End Date:SW|2009-10-31T00:00:00Z _Comments:SW| " ows__ModerationStatus="0" ows__Level="1" ows_Last_x0020_Modified="11;#2011-07-04 16:23:55" ows_Quarter_x002d_End_x0020_Date="2009-10-31 00:00:00" ows_ID="11" ows_owshiddenversion="3" ows_UniqueId="11;#{E51AB6A9-DDE1-4F66-8E44-EDFA3D0AFF7F}" ows_FSObjType="11;#0" ows_Created_x0020_Date="11;#2011-07-04 16:23:27" ows_ProgId="11;#" ows_FileLeafRef="11;#Deal Name Q2.doc" ows_Modified="2011-07-04 16:23:55" ows_FileRef="11;#sites/site1/deals/Deal Name Q2.doc" ows_DocIcon="doc" ows_Editor="605;#Doe, John" xmlns:z="#RowsetSchema" />
</rs:data>

und ich habe keine Ahnung, wie ich CAML benutzen würde, um das auseinander zu brechen. (Außerdem verwende ich Sharepoint Server 2007, nicht 2010)

12
Christian

Nicht sicher, ob dies erforderlich ist, aber sind mehr als eine Sharepoint-Site Gehostet bei "website.com" (Die, auf die ich zugreifen möchte. ist "website.com/sites/mysite") Tut das Dinge ändern?

Absolut tut es! Die von Ihnen entdeckten Webdienst-URLs sind tatsächlich virtuell. Das URL-Muster _vti_bin/Lists.asmx steht unter JEDER SharePoint-Website zur Verfügung. Die Website, auf der sich Ihre Liste befindet, muss der Ausgangspunkt für Ihre Webdienst-URL sein.

Versuchen Sie also: http://website.com/sites/mysite/_vti_bin/Lists.asmx

Möglicherweise finden Sie auch den Artikel SharePoint Web Service-Richtlinien von MSDN hilfreich.


UPDATE # 1:

CAML wird Ihnen nicht dabei helfen, Ihre Ergebnisse zu "zerlegen". Es handelt sich ausschließlich um eine Abfrage-/Filtertechnologie, und es sieht so aus, als würden Sie sie entsprechend verwenden. Es liegt an Ihnen, uns zu sagen, ob das Ergebnis, das Sie erhalten, das ist, was Sie erwarten. Wenn Sie Hilfe beim Erstellen komplexerer CAML-Abfragen benötigen, empfehle ich Ihnen, eine Kopie von U2Us CAML Query Builder herunterzuladen (dies ist jedoch ein anderes Thema).

Also zu den Ergebnissen. Es ist ein wenig verwirrend, es zu betrachten, aber es gibt eine Methode für den Wahnsinn. Die Spalten, die Sie in Ihrer Liste eingerichtet haben, sind alle hier (vorausgesetzt, Sie beschränken sich nicht auf die CAML-Abfrage, was möglich ist). Sie werden feststellen, dass sie den internal - Namen von SharePoint für die Spalte verwenden, denen ows_ vorangestellt ist. Wenn Sie also die internen Namen kennen, können Sie die XML-Attributnamen erstellen und XML-Klassen, LINQ oder XSLT verwenden, um in die Ergebnisse einzutauchen und das zu erhalten, was Sie benötigen. Siehe meine Antwort auf eine andere SO Frage für Tipps zum Ermitteln der internen Spaltennamen von SP .

Wenn es hilfreich ist zu wissen, was ich in dieser Situation mache, erstelle ich einfach eine POCO - Modellklasse, um eines meiner Listenelemente darzustellen, und schreibe eine Parser-Methode, um die XML-Ergebnisse von SharePoint zu verwenden und eine Sammlung von zurückzugeben die Modellobjekte. Ich mag LINQ to XML für diese Aufgabe.

Wenn Sie SharePoint 2010 verwenden, können Sie die neuen Client Object Model-Klassen verwenden, um besser verwaltete Wrapper für die Arbeit mit SharePoint-Websites, Listen, ListItems usw. zu erhalten.


UPDATE # 2:

Nur für einige Farben stelle ich ein Beispiel des Codes bereit, den ich zum Analysieren von SharePoint XML verwende. Registrant ist in diesem Beispiel eine POCO-Modellklasse, die ich zur Darstellung eines SharePoint-Listenelements für eine benutzerdefinierte Liste geschrieben habe. Es ist trivial und ich werde mich nicht darum kümmern.

/// <summary>
/// Parses registrant XML returned from SharePoint's Lists web service into a collection 
/// of <see cref="Registrant"/> objects (root element = "listitems").
/// </summary>
/// <param name="xml">SharePoint XML</param>
/// <returns>Collection of Registrant objects, or null if no registrant data could be parsed.</returns>
public static List<Registrant> ParseSharePointXmlCollection( XElement xml ) {

  // Test: Not expected XML element or has no child elements
  if ( !xml.Name.LocalName.Equals( "listitems" ) || !xml.HasElements ) {
    return null;
  }

  List<Registrant> regList = null;

  XElement data = xml.Element( XName.Get( "data", "urn:schemas-Microsoft-com:rowset" ) );
  if ( (data != null) && (data.HasElements) ) {

    regList = new List<Registrant>();

    IEnumerable<XElement> regXmlNodes = data.Elements( XName.Get( "row", "#RowsetSchema" ) );
    foreach (XElement regXml in regXmlNodes) {
      Registrant reg = ParseSharePointXml( regXml );
      if ( reg != null ) {
        regList.Add( reg );
      }
    }
  }

  return regList;
}

/// <summary>
/// Parses registrant XML returned from SharePoint's Lists web service into a single 
/// <see cref="Registrant"/> object (root element = "row").
/// </summary>
/// <param name="xml">SharePoint XML</param>
/// <returns>A Registrant object, or null if no registrant data could be parsed.</returns>
public static Registrant ParseSharePointXml( XElement xml ) {

  // Test: Not expected XML element or has no attributes
  if ( !xml.Name.LocalName.Equals( "row" ) || !xml.HasAttributes ) {
    return null;
  }

  Registrant reg = null;

  // Parse ID (if this fails, fail the whole operation)
  if ( xml.Attribute( "ows_ID" ) != null ) {
    reg = new Registrant();
    reg.ID = xml.Attribute( "ows_ID" ).Value;
  }
  else {
    return null;
  }

  // Parse First Name
  if ( xml.Attribute( "ows_Q_Registrant_x0020_First_x0020_N" ) != null ) {
    reg.FirstName = xml.Attribute( "ows_Q_Registrant_x0020_First_x0020_N" ).Value;
  }

  // Parse Last Name
  if ( xml.Attribute( "ows_Q_Registrant_x0020_Last_x0020_Na" ) != null ) {
    reg.LastName = xml.Attribute( "ows_Q_Registrant_x0020_Last_x0020_Na" ).Value;
  }

  // Parse Email
  if ( xml.Attribute( "ows_Q_Registrant_x0020_Email" ) != null ) {
    reg.Email = xml.Attribute( "ows_Q_Registrant_x0020_Email" ).Value;
  }

  // Parse Assistant Name
  if ( xml.Attribute( "ows_Q_Asst_x0020_First_x0020_Name" ) != null ) {
    reg.AssistantFirstName = xml.Attribute( "ows_Q_Asst_x0020_First_x0020_Name" ).Value;
  }
  if ( xml.Attribute( "ows_Q_Asst_x0020_Name" ) != null ) {
    reg.AssistantLastName = xml.Attribute( "ows_Q_Asst_x0020_Name" ).Value;
  }

  // Parse Assistant Email
  if ( xml.Attribute( "ows_Q_Asst_x0020_Email" ) != null ) {
    reg.AssistantEmail = xml.Attribute( "ows_Q_Asst_x0020_Email" ).Value;
  }

  return reg;
}

UPDATE # 3:

Beispielcode zum Konvertieren eines XmlNode-Objekts in eine XElement:

public static XElement GetXElement( this XmlNode node ) {
  XDocument xdoc = new XDocument();
  using ( XmlWriter xmlWriter = xdoc.CreateWriter() ) {
    node.WriteTo( xmlWriter );
  }
  return xdoc.Root;
}
25
CBono

In meiner Arbeit musste ich etwas Ähnliches tun wie Harmon.ies SharePoint Add-on . Sie verfügen über eine ganze Reihe von Funktionen, die SharePoint und Outlook integrieren. Ich musste nur Dokumente in Outlook als Seitenleiste auflisten, also habe ich versucht, sie selbst zu entwickeln.
Ich habe versucht, das Open-Source-Code-Forum dieses Projekt anzupassen, aber es endete weit über meiner Tiefe ... Sie können es als Referenz verwenden, ich bin sicher, es wird Ihnen helfen.

0
Lea Krause