Как использовать веб-службу Sharepoint для получения списка документов из .NET? - PullRequest
12 голосов
/ 04 июля 2011

Технологии: Winforms, .NET, C #, веб-службы Sharepoint

В настоящее время я пишу настольное приложение winform, которое должно получить доступ к определенному списку документов Sharepoint и пользовательских переменных ввода (из документа SharepointБиблиотека)

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

Этот сайт дал мне хорошее представление о том, какие веб-сервисы доступны, но я не могу понять, как получить доступ к тому, что я хочу.

Использование веб-сайтов website.com/_vti_bin/Lists.asmx и website.com/_vti_bin/Dws.asmx в качестве веб-ссылок.

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

Это была моя первая попытка подключения, и она дает мнеSOAPException (это подробности, которые я могу предоставить)

Не уверен, что это необходимо, но есть несколько сайтов sharepoint, размещенных на "website.com" (тот, к которому я пытаюсь получить доступ)это "website.com/sites/mysite") Это что-то меняет?

Я просто пытаюсь выяснить, нахожусь ли я на правильном пути в использовании этого сервиса, или я получил еговсе не так

РЕДАКТИРОВАТЬ 1: оставьте исходный вопрос, чтобы люди понимали, что происходит.

@ CBono: Ссылка на статью, которую вы связали, очень помогла начать работу.(Я пока не могу проголосовать :() Мне удалось получить список, но форматирование или получение данных оказалось затруднительным. Вот что было предоставлено:

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

Но мои результаты выглядят такэто:

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

и у меня нет идеи, как бы я использовал CAML, чтобы разорвать это на части. (Кроме того, я использую Sharepoint Server 2007, а не 2010

Ответы [ 2 ]

25 голосов
/ 04 июля 2011

Не уверен, если это необходимо, но есть больше чем один сайт sharepoint, размещенный на "website.com" (я пытаюсь получить доступ к сайту "website.com/sites/mysite").изменить вещи?

Абсолютно это делает!URL-адреса веб-служб, которые вы обнаружили, на самом деле являются виртуальными, то есть шаблон URL _vti_bin/Lists.asmx доступен на КАЖДОМ сайте SharePoint.Независимо от того, на каком сайте находится ваш список, он должен быть отправной точкой для URL-адреса вашей веб-службы.

Таким образом, попробуйте: http://website.com/sites/mysite/_vti_bin/Lists.asmx

Возможно, вы найдете MSDN Руководство по веб-службам SharePoint статья тоже полезна.


ОБНОВЛЕНИЕ № 1:

CAML не поможет вам «разбить» ваши результаты.Это технология запросов / фильтров, и похоже, что вы используете ее надлежащим образом.Вы сами должны сказать нам, ожидаете ли вы того набора результатов, который вы получаете.Если вам нужна помощь в построении более сложных запросов CAML, я предлагаю загрузить копию CAML Query Builder U2U *1021* (но это уже другая тема).

Итак, перейдем к результатам.Это немного сбивает с толку, но в этом безумии есть какой-то метод.Все столбцы, которые вы настроили в своем списке, находятся здесь (при условии, что вы не ограничиваете их в запросе CAML, что возможно).Вы заметите, что они используют внутреннее имя SharePoint для столбца с префиксом ows_.Итак, если вы знаете внутренние имена, вы можете создать имена атрибутов XML и использовать классы XML, LINQ или XSLT, чтобы погрузиться в результаты и получить то, что вам нужно.См. мой ответ на другой вопрос SO, в котором приведены советы по определению имен внутренних столбцов SP .

Если это поможет узнать, что я делаю в этой ситуации, я просто создаю POCO класс модели для представления одного из элементов моего списка, а также написание метода синтаксического анализа для получения результатов XML в формате SharePoint и возврата коллекции объектов модели.Мне нравится LINQ to XML для этой задачи.

Если бы вы использовали SharePoint 2010, вы могли бы использовать новые классы клиентской объектной модели и получить более управляемые оболочки для работы с сайтами SharePoint,Списки, ListItems и тому подобное.


ОБНОВЛЕНИЕ № 2:

Просто для некоторого цвета я публикую пример кода, который я использую для разбора SharePointXML.Registrant в этом примере - класс модели POCO, который я написал для представления элемента списка SharePoint для настраиваемого списка.Это тривиально, и я не буду публиковать его.

/// <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;
}

ОБНОВЛЕНИЕ № 3:

Пример кода для преобразования объекта XmlNode вXElement:

public static XElement GetXElement( this XmlNode node ) {
  XDocument xdoc = new XDocument();
  using ( XmlWriter xmlWriter = xdoc.CreateWriter() ) {
    node.WriteTo( xmlWriter );
  }
  return xdoc.Root;
}
0 голосов
/ 17 марта 2013

В своей работе мне нужно было сделать что-то похожее на дополнение Harmon.ie для SharePoint . У них есть целый набор функций, которые интегрируют SharePoint и Outlook. Мне нужно было только перечислить документы в Outlook в качестве боковой панели, поэтому я попытался разработать его самостоятельно.
Я пытался адаптировать форум с открытым исходным кодом этот проект , но в итоге оказался за пределами моей глубины. Вы можете использовать его в справочных целях, я уверен, что это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...