Знаете ли вы, что в 2016 году «ошибка зомби ItemID Cache»? - PullRequest
0 голосов
/ 18 мая 2018

После переноса различных JavaScript-приложений SharePoint 2013 в SharePoint 2016 мне пришлось взглянуть на странное явление API отдыха SharePoint 2016:

предположим, что у вас есть 2 вызова ajax

  1. Загрузить файл -> возвращает spFile
  2. получить элемент списка для загруженного файла -> возвращает spItem

    jQuery.ajax({
        url: "/sites/mysite/_api/web/getFolderByServerRelativeUrl('/sites/mySite/myLibrary')/files/add(overwrite=true, url='test1.txt')",
        type: "POST",
        data: params.arraybuffer,
        processData: false,
        headers: { "Accept": "application/json;odata=verbose", "X-RequestDigest": params.digest, "X-HTTP-Method": "POST","If-Match": "*" },
        success: function (file) {
            //get listItem for uploaded file
            jQuery.ajax({
                url: file.d.ListItemAllFields.__deferred.uri,
                type: "GET",
                headers: { "accept": "application/json;odata=verbose" },
                success: function (result) {
                    //after first upload: OK
                    var id = result.d.ID;
                }
            });
        }
    });
    

Если файл не имеетпока существует по этому URL, все ок.SharePoint создает новый элемент списка, и вы получите новый элемент с правильным идентификатором во втором вызове. Предположим, мы получили идентификатор 1.

Если файл с таким именем уже существовал под этим URL, ипозже он был удален, SharePoint создает новый элемент с новым идентификатором.Это как и ожидалось.НО: в этом случае SharePoint Rest API возвращает неправильный элемент списка.Вместо нового созданного элемента списка (идентификатор 2) вы получите старый удаленный элемент с идентификатором 1.

В SharePoint 2013 эта ошибка не возникает.В SharePoint 2016 - эта ошибка возникает только в случае одного и того же контекста браузера для вызова ajax 1 и вызова ajax 2. Обычно эта ошибка затрагивает вас, если вы загружаете файл и одновременно вы обновляете некоторые мета значения.

Кажется, это ошибка в SharePoint 2016. Полагаю, MS внедрила более строгий алгоритм кэширования и справилась с задачей.

1 Ответ

0 голосов
/ 18 мая 2018

Пока MS не исправит эту ошибку, я нашел обходной путь:

  1. Загрузите ваш файл под временным именем - jQuery.Guid.New () + myExtension
  2. получитеновый элемент для вашего загруженного файла
  3. отправить вызов для удаления возможно существующего файла с реальным именем цели
  4. переименовать загруженный файл в реальное имя цели

                    var real_filename = 'test1.txt';
                    var temp_filename = jQuery.Guid.New() + '.txt';
                    // upload temp_filename instead real filename - fixes SharePoint 2016 ZombieId CacheBug
                    jQuery.ajax({
                        url: "/sites/mySite/_api/web/getFolderByServerRelativeUrl('/sites/mySite/myLibrary')/files/add(overwrite=true, url='" + temp_filename + "')",
                        type: "POST",
                        data: params.arraybuffer,
                        processData: false,
                        headers: { "Accept": "application/json;odata=verbose", "X-RequestDigest": params.digest, "X-HTTP-Method": "POST","If-Match": "*" },
                        success: function (file) {
                            //delete a possiblly existing file with real target name
                            jQuery.ajax({
                                url: "/sites/mySite/_api/web/GetFileByServerRelativeUrl('/sites/mySite/myLibrary/" + real_filename + "')",
                                type: "POST",
                                processData: false,
                                headers: { "Accept": "application/json;odata=verbose", "X-RequestDigest": params.digest, "X-HTTP-Method": "DELETE", "If-Match": "*" },
                                success: function () {
                                    //target file was existing
                                    finalize(file);
                                },
                                error: function () {
                                    //target file was not existing
                                    finalize(file);
                                }
                            });
                        }
                    });
                    function finalize(file) {
                        //get listItem for uploaded file
                        jQuery.ajax({
                            url: file.d.ListItemAllFields.__deferred.uri,
                            type: "GET",
                            headers: { "accept": "application/json;odata=verbose" },
                            success: function (result) {
                                var spItem = result.d;
                                //rename the uploaded file
                                jQuery.ajax({
                                    url: spItem.__metadata.uri,
                                    type: "POST",
                                    data: JSON.stringify({ __metadata: { 'type': spItem.__metadata.type }, FileLeafRef: real_filename }),
                                    headers: { "Accept": "application/json;odata=verbose", "X-RequestDigest": params.digest, "content-type": "application/json;odata=verbose", "X-HTTP-Method": "MERGE", "If-Match": "*" },
                                    success: function () {
                                        //file was renamed
                                        spItem.FileLeafRef = real_filename;
                                        defer.resolve(spItem);
                                    },
                                    error: function (e) {
                                        //something went wrong
                                        defer.resolve(null, e);
                                    }
                                });
                            }
                        });
                    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...