OpenStack .NET API,使用cloudFilesProvider.CreateObjectFromFile传入时未添加元数据

时间:2013-08-06 16:51:53

标签: .net openstack rackspace-cloud rackspace

使用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);

在ProviderBase.cs的StreamRESTRequest方法中,这里的头数是6 [我添加的5个项目+在RestService.Stream之前添加的X-Auth-Token]

所以我知道所有项目都被传递给resquest,但是在创建对象之后,如果我做了一个获取cloudFilesProvider.GetObjectMetaData,那么我得到一个带有计数0的字典。

然后我做了

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

这里如果我做了一个获取cloudFilesProvider.GetObjectMetaData我在词典中得到了添加的元数据。

那怎样才能做得更好呢?

2 个答案:

答案 0 :(得分:1)

看起来你正在用一个意外的参数调用该方法。 CreateObjectFromFile方法采用headers字典,该字典实际上是要添加到请求的原始HTTP标头。由于Metadata类派生自Dictionary<string, string>,因此当您为此参数传递Metadata时,代码仍然会编译,但结果并不像您期望的那样。

SDK中没有直接支持在Metadata的调用中包含CreateObjectFromFile对象。此外,OpenStack Object Storage API Reference不包含有关在基础Create Object API方法中包含标头的任何信息。

您有两种方法可以解决此问题:

  1. 创建对象后,请使用记录的UpdateObjectMetadata调用。
  2. 尝试使用在X-Object-Meta-xxx传递给headers方法的CreateObjectFromFile中添加{{1}}元数据的未记录功能(这可能有效,也可能无效,可能因OpenStack实施而异,可能会有所变化任何时候的行为)。
  3. 显然我建议你坚持使用记录的方法。 :)

答案 1 :(得分:0)

所以对于那些好奇的人,我确实尝试了来自this anwser的选项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