Подтвердить что ты не робот

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

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

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

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

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

Используя веб-сайт website/_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: leavig исходный вопрос, чтобы люди понимали, что происходит.

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

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

4b9b3361

Ответ 1

Не уверен, что это необходимо, но там больше, чем один сайт 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, я предлагаю загрузить копию U2U CAML Query Builder (но это другая тема).

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

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

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


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

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

/// <summary>
/// Parses registrant XML returned from SharePoint 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 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;
}

Ответ 2

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