【问题标题】:SharePoint/GetVersionCollection - how to identity which version?SharePoint/GetVersionCollection - 如何识别哪个版本?
【发布时间】:2015-02-08 06:15:23
【问题描述】:

我需要能够从 SharePoint 列表中的项目中查询旧字段值。我无法在服务器上执行代码(它需要与 SharePoint Online/O365 一起使用才能开始)。 到目前为止,我唯一可以让我这样做的 API 是 lists.asmx GetVersionCollection SOAP 调用。 这让我可以指定一个字段名称并返回一个 XML 结构,其中包含各种版本的值,以及修改时间和谁​​进行了更改 - 但没有可靠的方法来实际识别 which 版本(即ID 或标签)。也就是说,如果我知道我需要从列表“文档”中第 1 项的版本 512 中获取 Title 值,我看不到如何可靠地解析结果以确定哪个条目是版本 512。虽然它们可能会返回顺序,在许多情况下,当不存在字段值时(或者可能尚未创建字段时),条目实际上丢失了。我尝试将修改日期与相应 FileVersion 项目的创建日期进行比较(我可以通过 CSOM 或 REST 获得),虽然它在某些时候有效,但并不可靠。我还查看了 lists.asmx GetVersion API 的输出,但我也看不出它有什么用处,因为所有版本的 Created 属性似乎总是​​文件最初创建的日期。 对我来说,没有一种简洁的方法似乎很奇怪——如果我需要返回多个字段的信息但只需要一个版本,我必须发出大量请求,这些请求返回的信息远远超过我的需要,然后我需要弄清楚在多值分类字段等情况下如何解析返回的文本。 有人试过在这里做类似的事情吗?

谢谢

迪伦

【问题讨论】:

    标签: sharepoint sharepoint-2013 csom


    【解决方案1】:

    我建议考虑以下选项:

    使用 SharePoint Web 服务

    这可能是使用Lists.GetVersionCollection Method 的最佳选择,但正如您在问题中正确提到的那样,您只能请求每个字段的版本信息。以下示例演示如何检索多个字段的版本信息并确定版本信息。

    C# 示例

    public static Dictionary<string, List<VersionProperty>> GetVersionHistory(Uri webUri, string listName, int itemId, string[] fieldsToRetrieve)
    {
    
            var listsProxy = new Lists.Lists();
            listsProxy.Url = webUri + "/_vti_bin/Lists.asmx";
    
            //Retrieve version labels
            var versionsResult = listsProxy.GetVersionCollection(listName, itemId.ToString(), "Version");
            var versionsXml = XElement.Parse(versionsResult.OuterXml);
            XNamespace xmlns = "http://schemas.microsoft.com/sharepoint/soap/";
            var versionLabels = versionsXml.Descendants(xmlns + "Version").Select(e => new VersionLabel()
            {
                VersionNo = e.Attribute("Version").Value,
                Modified = e.Attribute("Modified").Value,
                ModifiedBy = e.Attribute("Editor").Value
            }).ToList();
    
            //Retrieve properties
            var versionHistory = new Dictionary<string, List<VersionProperty>>();
            foreach (var f in fieldsToRetrieve)
            {
                versionsResult = listsProxy.GetVersionCollection(listName, itemId.ToString(), f);
                versionsXml = XElement.Parse(versionsResult.OuterXml);
                var properties = versionsXml.Descendants(xmlns + "Version").Select((e, i) => new VersionProperty { Label = versionLabels[i], Value = e.Attribute(f).Value });
                versionHistory[f] = properties.ToList(); 
            }
            return versionHistory;
    }
    

    在哪里

    public class VersionLabel
    {
        public string VersionNo { get; set; }
    
        public string Modified { get; set; }
    
        public string ModifiedBy { get; set; }
    
    }
    
    public class VersionProperty
    {
        public VersionLabel Label { get; set; }
    
        public string Value { get; set; }
    }
    

    用法

    var listName = "Documents";
    var itemId = 1;
    var fieldsToRetrieve = new[] { "Title", "TaxKeyword" };
    var versionHistory = GetVersionHistory(webUri, listName, itemId, fieldsToRetrieve);
    

    结果

    Versions.aspx应用页面提取版本历史

    请求Versions.aspx 开箱即用的 SharePoint 应用程序页面并从 html 内容中提取版本历史信息的另一个选项。

    Versions.aspx 页面

    以下示例演示如何加载Versions.aspx页面内容(负责提取版本信息的部分省略)。

    C# 示例

     public static  Dictionary<string, List<VersionProperty>> GetVersionsPageInfo(string webUrl,ICredentials credentials, Guid listId,int itemId)
     {
            var versionsPageUrl = string.Format("{0}/_layouts/versions.aspx?list={1}&ID={2}",webUrl, listId,itemId);
            using (var client = new WebClient())
            {
                client.Credentials = credentials;
                client.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f");
                var content = client.DownloadString(versionsPageUrl);
                //extract version history info goes here.. 
            }
     }
    

    【讨论】:

    • 非常详细的答案,谢谢,但在多次查询 O365 时并没有真正解决性能问题,这是我的主要问题。
    • 我同意 SharePoint Web 服务的性能问题,但第二种方法如何,从versions.aspx 页面获取版本历史记录?在这种情况下,只需向服务器执行一个请求,之后您只需从 HTML 内容中提取版本信息。
    • 那没有所有的字段数据,而且它所拥有的数据往往不是可以用来可靠地提取基础值的格式。
    【解决方案2】:

    关于版本here,我回答了几乎类似的问题。我希望这会以某种方式引导您走上正确的道路,但基本上这个解决方案所做的是它通过ListItem 的所有FileVersion。从那里你可以得到版本号。至于512、1048等如何使用正确的版本号,您可以阅读有关here的详细信息。

    【讨论】:

    • 这无助于检索特定版本的所有字段值,我的代码现在确实可以工作,但对于 O365 来说速度非常慢(每个字段都必须一个一个地查询,并且每次调用都会从整个历史记录中提取所有值)。
    猜你喜欢
    • 2023-03-17
    • 2019-09-04
    • 2011-01-17
    • 2018-05-27
    • 2011-01-13
    • 2011-02-18
    • 2019-07-20
    • 1970-01-01
    • 2013-03-22
    相关资源
    最近更新 更多