Domanda

I am using the Changes API to fetch changes:

ChangeQuery cq = new ChangeQuery(true, true);
cq.ChangeTokenStart = new ChangeToken();
cq.ChangeTokenStart.StringValue = string.Format("1;1;{0};{1};-1", site.Id, DateTime.Now.AddDays(-1).ToUniversalTime().Ticks.ToString());
cq.FetchLimit = 1000;
cq.RecursiveAll = false;
cq.GroupMembershipAdd = false;
cq.GroupMembershipDelete = false;
cq.RoleAssignmentAdd = false;
cq.RoleAssignmentDelete = false;
cq.RoleDefinitionUpdate = false;
cq.RoleDefinitionAdd = false;
cq.RoleDefinitionDelete = false;
cq.User = false;
cq.SystemUpdate = false;
cq.Group = false;
cq.SecurityPolicy = false;
cq.Update = false;
cq.Add = true;
cq.DeleteObject = false;
cq.Item = true;
cq.File = false;
cq.Folder = false;
cq.Alert = false;
cq.Web = false;
cq.LatestFirst = false;//Sorting

while (cq.ChangeTokenStart != null)
{
    var changes = context.Site.GetChanges(cq);
    context.Load(changes);
    context.ExecuteQuery();
    Console.WriteLine("Page");
    Change lastChangeItem = null;


    foreach (Microsoft.SharePoint.Client.Change change in changes)
    {
        Console.WriteLine(string.Format("Chnage is {0}", change.ChangeType));


        if (change is ChangeItem)
        {
            ChangeItem changeItem = (ChangeItem)change;
            List list = context.Web.Lists.GetById(changeItem.ListId);
            context.Load(list);
            context.Load(list.Fields);
            context.ExecuteQuery();
            Console.Write("List {0}", list.Id);
        }

        lastChangeItem = change;
    }

    if (lastChangeItem == null)
    {
        cq.ChangeTokenStart = null;
    }
    else
    {
        cq.ChangeTokenStart = lastChangeItem.ChangeToken;
    }
}

But I'm getting errors when trying to do this. Some of the ChangeItem values refer to lists that do not exist:

The page you selected contains a list that does not exist.  It may have been deleted by another user.

I did not delete any lists during my test. Just added new site and some new documents to a document library.

So in summary, I'm getting "ghost" lists and list items that do not actually exist as far as I can tell.

What are these "ghost ChangeItem" values? where are they coming from and should I be doing something to filter them?

È stato utile?

Soluzione

There are some hidden lists in SharePoint which are used internally. For example, User Information List (UIL) (although UIL will never get deleted). There is a chance that some hidden system-defined list was deleted automatically and that is why you are getting this error. Try some other site and see if you get the same error.

Altri suggerimenti

You're requesting changes from a site collection:

var changes = context.Site.GetChanges(cq);

And then trying to retrieve a list which is possibly located in another site from the current site:

List list = context.Web.Lists.GetById(changeItem.ListId);

So, first you must connect to the right site and then request a list from that site.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top