it-swarm.com.ru

Как использовать веб-службу Sharepoint для получения списка документов из .NET?

Технологии: Winforms, .NET, C #, Sharepoint Web Services

В настоящее время я пишу настольное приложение 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). Это что-то меняет?

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

EDIT 1: оставьте исходный вопрос, чтобы люди понимали, что происходит.

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

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

12
Christian

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

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

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

Возможно, вы найдете также полезными MSDN's Руководство по веб-сервисам SharePoint article.


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

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

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

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

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


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

Я просто публикую пример кода, который я использую для разбора SharePoint XML. В этом примере 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;
}
25
CBono

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

0
Lea Krause