OpenStack .NET API, метаданные не добавляются при передаче с помощью cloudFilesProvider.CreateObjectFromFile

Невозможно добавить метаданные при создании объекта с помощью cloudFilesProvider.CreateObjectFromFile. Поддерживается ли это в cloudFilesProvider.CreateObjectFromFile? В настоящее время я делаю:

DicMetaData.Add("StoreID", inStrContainerID);
DicMetaData.Add("FileType", instrFileType);
DicMetaData.Add("DateCreated", dTDateCreated.ToString("MM/dd/yyyy hh:mm:ss.FFF"));
DicMetaData.Add("isProcessed", "0");
DicMetaData.Add("DateProcessed", DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss.FFF"));

cloudFilesProvider.CreateObjectFromFile(inStrContainerID, inStrSrcFilePath, strDesFileName, 4096, DicMetaData);

Поэтому при вызове cloudFilesProvider.CreateObjectFromFile я сделал все возможное, чтобы

RestService.Stream(absoluteUri, method, stream, chunkSize, maxReadLength, headers, queryStringParameter, requestSettings, progressUpdated);

в методе StreamRESTRequest ProviderBase.cs, и здесь количество заголовков было 6 [5 элементов, которые я добавил + X-Auth-Token, который добавляется перед RestService.Stream]

поэтому я знаю, что все элементы передаются в запрос, но после создания объекта, если я выполню get cloudFilesProvider.GetObjectMetaData, я верну словарь со счетом 0.

Тогда я сделал

cloudFilesProvider.CreateObjectFromFile(inStrContainerID, inStrSrcFilePath, strDesFileName);
cloudFilesProvider.UpdateObjectMetadata(inStrContainerID, strDesFileName, DicMetaData);

здесь, если я сделаю get cloudFilesProvider.GetObjectMetaData, я верну добавленные метаданные в словарь.

Итак, как это можно сделать лучше?


person gopstar    schedule 06.08.2013    source источник


Ответы (2)


Похоже, вы вызываете метод с неожиданным аргументом. Метод CreateObjectFromFile принимает словарь headers, который на самом деле представляет собой необработанные заголовки HTTP для добавления к запросу. Поскольку класс Metadata является производным от Dictionary<string, string>, ваш код по-прежнему компилируется, когда вы передаете Metadata для этого аргумента, но результат не такой, как вы ожидали.

В SDK нет прямой поддержки включения объекта Metadata в вызов CreateObjectFromFile. Кроме того, Справочник по API OpenStack Object Storage не включает любая информация о включении заголовков в базовый Create Объект Метод API.

У вас есть два способа решить эту проблему:

  1. Используйте задокументированный вызов UpdateObjectMetadata после создания объекта.
  2. Попытка использовать недокументированную функцию добавления метаданных X-Object-Meta-xxx в headers, переданную методу CreateObjectFromFile (это может работать или не работать, может различаться в разных реализациях OpenStack и может изменить поведение в любое время).

Очевидно, я рекомендую вам придерживаться задокументированного метода. :)

person Sam Harwell    schedule 06.08.2013

Итак, для тех, кому интересно, я поэкспериментировал с вариантом 2 из этого ответа:

DicMetaData.Add("X-Object-Meta-StoreID", inStrContainerID);
DicMetaData.Add("X-Object-Meta-FileType", instrFileType);
DicMetaData.Add("X-Object-Meta-DateFileCreated", dTDateCreated.ToString("MM/dd/yyyy hh:mm:ss.FFF"));
DicMetaData.Add("X-Object-Meta-isProcessed", "0");
DicMetaData.Add("X-Object-Meta-DateProcessed", DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss.FFF"));

cloudFilesProvider.CreateObjectFromFile(inStrContainerID, inStrSrcFilePath, strDesFileName, 4096, DicMetaData);

Metadata = cloudFilesProvider.GetObjectMetaData(inStrContainerID, inStrFileName);

и в конечном итоге поднял больше вопросов.

Метатеги были добавлены в файлы, но имена тегов немного изменились. для записи X-Object-Meta-isProcessed я ожидал тег с именем isProcessed, а когда я сделал cloudFilesProvider.GetObjectMetaData, имя тега было Isprocessed

person gopstar    schedule 06.08.2013
comment
Спецификация HTTP 1.1 требует, чтобы ключи заголовка считались нечувствительными к регистру. Вы никогда не должны полагаться на конкретный случай для ключей, и ваши сравнения всегда должны выполняться с использованием StringComparison.OrdinalIgnoreCase. Также обратите внимание, что это правило применяется к службам, которые передают метаданные в заголовках (например, служба хранилища объектов), но не к службам, которые передают их в теле запроса/ответа JSON (например, служба вычислений для метаданных сервера и изображения). - person Sam Harwell; 07.08.2013