none
csom не могу получить версии элемента. шарепоинт 2010 RRS feed

  • Вопрос

  • Здравствуйте! почему то не получается взять версии элемента списка.

      using (ClientContext ctx = new ClientContext("http://sp2010.domain.ru/Test/"))
                {
                    ctx.Credentials = new NetworkCredential("login", "pass", "domain");
    
                    CamlQuery camlQuery = new CamlQuery();
    
                    Web web = ctx.Web;
    
                    ctx.Load(web,
    
                                        w => w.ServerRelativeUrl,
    
                                        w => w.Lists);
    
                    List list = web.Lists.GetByTitle("testList");
    
                    ctx.Load(list);
    
                    ListItemCollection itemColl = list.GetItems(camlQuery);
    
                    ctx.Load(itemColl);
    
                    ctx.ExecuteQuery();
    
                    foreach (ListItem item in itemColl)
                    {
    
                        File fileVersion = web.GetFileByServerRelativeUrl(web.ServerRelativeUrl + "/Lists/" + list.Title + "/" + item.Id + "_.000");
    
                        ctx.Load(fileVersion);
    
                        FileVersionCollection fileVersionCollection = fileVersion.Versions;
    
                        ctx.Load(fileVersionCollection);
    
    
    //тут падает ошибка - 
    /*Необработанное исключение типа "Microsoft.SharePoint.Client.ServerException" в Microsoft.SharePoint.Client.Runtime.dll
    
    Дополнительные сведения: Файл не найден.*/
                        ctx.ExecuteQuery();
    
                        
    
                    }
    
    
                }


    кто нибудь делал такое? это консольное приложение.

    29 февраля 2016 г. 12:38

Ответы

  • Добрый день,

    1. У вас пропущены промежуточные вызовы ctx.ExecuteQuery();

    CamlQuery camlQuery = new CamlQuery();
                    Web web = ctx.Web;
                    ctx.Load(web,
                                        w => w.ServerRelativeUrl,
                                        w => w.Lists);
                    ctx.ExecuteQuery();  // !!!
                    List list = web.Lists.GetByTitle("testList");
                    ctx.Load(list);
                    ctx.ExecuteQuery(); // !!!
                    ListItemCollection itemColl = list.GetItems(camlQuery);
                    ctx.Load(itemColl);
                    ctx.ExecuteQuery();

    2. CSOM не возвращает версии элементов.

    Можно воспользоваться веб-сервисами SharePoint:

    public static string GetVersions(string siteUrl, string listId, string itemId, string fieldName)
            {
                StringBuilder sb = new StringBuilder();
    
                Lists listService = new Lists();
    
                listService.Credentials = System.Net.CredentialCache.DefaultCredentials;
                listService.Url = siteUrl + "/_vti_bin/lists.asmx";
    
                #region Get version histories
                if (!string.IsNullOrEmpty(fieldName))
                {
                    XmlNode nodeVersions = listService.GetVersionCollection(listId, itemId, fieldName);
    
                    foreach (System.Xml.XmlNode xNode in nodeVersions)
                    {
                        string dateHistory = xNode.Attributes["Modified"].Value;
                        dateHistory = FormatDateFromSP(dateHistory);
                        string commentHistory = xNode.Attributes[fieldName].Value;
                        string editor = GetEditor(xNode.Attributes["Editor"].Value);
    
                        sb.Append(editor + " (" + dateHistory + ") " + commentHistory + "\n\n");
                    }
                }
                #endregion
    
                return sb.ToString();
            }

    1 марта 2016 г. 3:39

Все ответы

  • Добрый день,

    1. У вас пропущены промежуточные вызовы ctx.ExecuteQuery();

    CamlQuery camlQuery = new CamlQuery();
                    Web web = ctx.Web;
                    ctx.Load(web,
                                        w => w.ServerRelativeUrl,
                                        w => w.Lists);
                    ctx.ExecuteQuery();  // !!!
                    List list = web.Lists.GetByTitle("testList");
                    ctx.Load(list);
                    ctx.ExecuteQuery(); // !!!
                    ListItemCollection itemColl = list.GetItems(camlQuery);
                    ctx.Load(itemColl);
                    ctx.ExecuteQuery();

    2. CSOM не возвращает версии элементов.

    Можно воспользоваться веб-сервисами SharePoint:

    public static string GetVersions(string siteUrl, string listId, string itemId, string fieldName)
            {
                StringBuilder sb = new StringBuilder();
    
                Lists listService = new Lists();
    
                listService.Credentials = System.Net.CredentialCache.DefaultCredentials;
                listService.Url = siteUrl + "/_vti_bin/lists.asmx";
    
                #region Get version histories
                if (!string.IsNullOrEmpty(fieldName))
                {
                    XmlNode nodeVersions = listService.GetVersionCollection(listId, itemId, fieldName);
    
                    foreach (System.Xml.XmlNode xNode in nodeVersions)
                    {
                        string dateHistory = xNode.Attributes["Modified"].Value;
                        dateHistory = FormatDateFromSP(dateHistory);
                        string commentHistory = xNode.Attributes[fieldName].Value;
                        string editor = GetEditor(xNode.Attributes["Editor"].Value);
    
                        sb.Append(editor + " (" + dateHistory + ") " + commentHistory + "\n\n");
                    }
                }
                #endregion
    
                return sb.ToString();
            }

    1 марта 2016 г. 3:39
  • Коллеги, позволю себе написать в этой теме, т.к. вопрос касаемо представленного кода: у меня почти аналогичная ситуация, вот код:

    	var clientContext = new SP.ClientContext.get_current();
    	var oWebsite = clientContext.get_web();
    	this.collList = oWebsite.get_lists();
    
    	clientContext.ExecuteQuery();
    	list = collList.getByTitle('Анатомия');
    	var camlQuery = new SP.CamlQuery();
    		camlQuery.set_viewXml('<View><Query><Where><And><Eq><FieldRef Name=\'Date\' />'+
    		'<Value Type=\'Choice\'>'+date+'</Value></Eq><Eq><FieldRef Name=\'Diapazon\' />'+
    		'<Value Type=\'Choice\'>'+diapazon+'</Value></Eq></And></Where></Query></View>');
    	clientContext.load(list);
    	clientContext.ExecuteQuery();
    	items = list.getItems(camlQuery);
    	clientContext.load(items);
    	clientContext.ExecuteQuery();
    	itemCount = items.get_count();

    И данный скрипт вываливается с ошибкой на строке первой строке clientContext.ExecuteQuery(); Ошибка следующая: Объект не поддерживает свойство или метод "ExecuteQuery"

    Кто-нибудь может подсказать в чем причина и как её побороть?


    1 марта 2016 г. 7:47
  • Евгений,

    в JSOM использовать executeQueryAsync

    Working with the ECMAScript Client Object Model (JSOM) in SharePoint 2010

    1 марта 2016 г. 7:54
  • JSOM only supports the asynchronous version of ExecuteQuery and so you need to provide two callback methods whenever you make a call to ExecuteQueryAsync; these methods specify the success and failure callback methods to call on the client when the request has been processed
    1 марта 2016 г. 7:56
  • Евгений,

    в JSOM использовать executeQueryAsync

    Working with the ECMAScript Client Object Model (JSOM) in SharePoint 2010

    Максим, у меня путаница возникла в CSOM и JSOM... Можете пояснить поподробнее? 
    Я в других скриптах использовал executeQueryAsync и все прекрасно работало, но сейчас мне нужно не асинхронно выполнить запрос, а синхронно...
    1 марта 2016 г. 7:59
  • CSOM - выполняется в .Net коде, например консольное приложение, в отличие от SSOM выполняется как на стороне сервера, так и на стороне клиента.

    JSOM - ECMAScript (javascript), выполняется на стороне клиента в браузере.

    Если расширенно, то так:

    Model Types:

    • CSOM: Client-side object model. C# (or Visual Basic) only, use NuGet, at the moment same package for both 2010 and 2013.
    • JSOM: JavaScript object model. JavaScript only.
      • SP.ClientContext.get_current() for normal use. new SP.ClientContext('url...') for specific SPSite. Note this works cross-SPSite in 2013.
    • SSOM: Server-side object model. C# (or Visual Basic) only, use Microsoft.SharePoint (15) DLL. Must be deployed on same farm.
    • REST: REST web technologies and standard Open Data Protocol (OData) syntax.

    Hosting:

    • SharePoint hosted: JavaScript and templates only. By templates I mean list templates, content types, etc. Anything that can be uploaded to the SharePoint virtual file system can also be added, such as .aspx-pages.
    • Autohosted: C# (or Visual Basic) only. Currently only supported on Office 365. On app purchase an Azure instance will be automatically provisioned. Uses OAuth to comunicate to SharePoint site.
    • Provider hosted: C# (or Visual Basic). Similar to Autohosted, but is meant to be hosted more manually (i.e. On Azure). So you fire up a web application, on any server, and then use S2S to connect to SharePoint.
    • Sandboxed: Remnant from 2010, can be uploaded to Solution gallery. Support for limited subset of the SSOM. No file access, so can not deploy anything to _layouts folder. If you use the limited SSOM-part (C#) your solution will be considered deprecated. Support for templates such as list templates and content types, deployed directly to host web.
    • Farm solution: Full access, deploy through PowerShell.
    • Изменено Maxim Shusharin 1 марта 2016 г. 8:24 Таблицы не получились
    1 марта 2016 г. 8:22
  • Максим,здравствуйте!! Спасибо, помогли)
    1 марта 2016 г. 9:24
  • Максим,здравствуйте!! Спасибо, помогли)

    Всегда пожалуйста.
    1 марта 2016 г. 9:45