web-dev-qa-db-fra.com

Comment utiliser le service Web Sharepoint pour obtenir une liste de documents à partir de .NET?

Technologies: Winforms, .NET, C #, Services Web Sharepoint

J'écris actuellement une application de bureau Winform qui est supposée accéder à une liste spécifique de documents Sharepoint et de variables d'entrée personnalisées (à partir d'une bibliothèque de documents Sharepoint).

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

Ce site Web m'a permis de bien comprendre quels services Web sont disponibles, mais je ne vois pas comment accéder à ce que je veux.

Utilisation de website.com/_vti_bin/Lists.asmx et de website.com/_vti_bin/Dws.asmx comme références Web.

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");

C'était ma première tentative de connexion, et cela me donne une exception SOAPException (c'est tout l'étendue des détails que je peux donner)

Je ne sais pas si cela est nécessaire, mais il existe plus d'un site SharePoint hébergé sur "website.com" (celui auquel j'essaie d'accéder est "website.com/sites/mysite"). Cela change-t-il les choses?

J'essaie simplement de savoir si je suis sur la bonne voie pour utiliser ce service ou si je me suis trompé

EDIT 1: Laisse la question initiale de côté pour que les gens comprennent ce qui se passe.

@CBono: L'article que vous avez lié a été d'une aide précieuse pour commencer à démarrer. (Je ne peux pas encore voter :() J'ai réussi à obtenir la liste, mais le formatage ou l'obtention AT des données s'avère difficile . Voici ce qui a été fourni:

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

Mais mes résultats ressemblent à ceci:

<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>

et je n'ai aucune idée de la façon dont j'utiliserais CAML pour le casser. (En outre, j'utilise Sharepoint Server 2007, pas 2010

12
Christian

Je ne sais pas si cela est nécessaire, mais là ya plus d’un site SharePoint hébergé sur "website.com" (celui auquel je tente d'accéder est "website.com/sites/mysite") Est-ce que changer les choses?

Absolument c'est le cas! Les URL de service Web que vous avez découvertes sont en réalité virtuelles, ce qui signifie que le modèle d'URL _vti_bin/Lists.asmx est disponible sous TOUS les sites SharePoint. Le site sur lequel votre liste vit doit être le point de départ de l'URL de votre service Web.

Donc, essayez: http://website.com/sites/mysite/_vti_bin/Lists.asmx

Vous pouvez également trouver les articles Règles du service Web SharePoint article de MSDN utiles également.


UPDATE # 1:

CAML ne vous aidera pas à "briser" vos résultats. Il s’agit strictement d’une technologie de requête/filtrage, et il semble que vous l’utilisez correctement. C'est à vous de nous dire si le résultat que vous récupérez est conforme à vos attentes. Si vous avez besoin d’aide pour construire des requêtes CAML plus complexes, je suggère de télécharger une copie de Le constructeur de requêtes CAML de U2U (mais c’est un autre sujet).

Alors, passons aux résultats. C'est un peu déroutant de le regarder, mais il y a une méthode à la folie. Les colonnes que vous avez configurées dans votre liste sont toutes ici (à condition que vous ne les contraigniez pas dans la requête CAML, ce qui est possible). Vous remarquerez qu'ils utilisent le nom internal de SharePoint pour la colonne, préfixé par ows_. Ainsi, si vous connaissez les noms internes, vous pouvez construire les noms d'attribut XML et utiliser les classes XML, LINQ ou XSLT pour vous plonger dans les résultats et obtenir ce dont vous avez besoin. Voir ma réponse à une autre SO question pour obtenir des conseils sur la manière de distinguer les noms de colonne internes du SP .

S'il est utile de savoir ce que je fais dans cette situation, je construis simplement une classe _ POCO model pour représenter l'un de mes éléments de liste et écris une méthode d'analyse pour prendre les résultats XML de SharePoint et renvoyer une collection du modèle. objets. J'aime LINQ to XML pour cette tâche.

Si vous utilisiez SharePoint 2010, vous pourriez utiliser les nouvelles classes de modèle d'objet client et obtenir de meilleurs wrappers gérés pour travailler avec les sites, les listes, les éléments de liste, etc. de SharePoint.


UPDATE # 2:

Juste pour un peu de couleur, je poste un exemple du code que j'utilise pour analyser le code XML de SharePoint. Registrant dans cet exemple est une classe modèle POCO que j'ai écrite pour représenter un élément de liste SharePoint pour une liste personnalisée. C'est trivial et je ne me donnerai pas la peine de le poster.

/// <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:

Exemple de code permettant de convertir un objet XmlNode en un 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

Dans le cadre de mes fonctions, je devais faire quelque chose de similaire au complément SharePoint d'Harmon.ie . Ils ont toute une gamme de fonctionnalités qui intègrent SharePoint et Outlook. Je n'avais besoin que de lister les documents dans Outlook sous forme de barre latérale, j'ai donc essayé de le développer moi-même .
J'ai essayé d'adapter le forum de code source ouvert ce projet , mais je me suis retrouvé bien au-delà de ma profondeur.

0
Lea Krause