2013-08-06 20 views
0

无法在使用cloudFilesProvider.CreateObjectFromFile创建对象时添加元数据。这是由cloudFilesProvider.CreateObjectFromFile支持吗?我目前在做:OpenStack .NET API,元数据在传入时无法添加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项我添加了+ X-Auth-Token,在RestService.Stream之前添加]

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

然后我做了

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

在这里,如果我做一个让cloudFilesProvider.GetObjectMetaData我得到的加元回到了字典。

那么这怎么能做得更好呢?

回答

1

它看起来像你用一个意外的参数调用该方法。 CreateObjectFromFile方法需要一个headers字典,它实际上是要添加到请求的原始HTTP头。由于Metadata类是从Dictionary<string, string>派生的,所以当您为此参数传递Metadata时,您的代码仍会编译,但结果与您预期的不同。

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

你有两种方法可以解决这个问题:

  1. 使用记录UpdateObjectMetadata调用创建对象之后。
  2. 尝试使用传递给CreateObjectFromFile方法的headers中添加X-Object-Meta-xxx元数据的未公开文档功能(这可能会也可能不行,可能因OpenStack实现而异,并且可能随时改变行为)。

很明显,我建议你坚持记录的方法。 :)

0

因此,对于那些好奇,我做实验选项2从this anwser:

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

+0

部首密钥由HTTP 1.1规范需要被视为不区分大小写的。你永远不应该依赖于特定的键,你的比较应该总是使用'StringComparison.OrdinalIgnoreCase'来完成。另请注意,此规则适用于在头中传递元数据的服务(例如对象存储服务),但不适用于在JSON请求/响应主体中传递它们的服务(例如服务器和图像元数据的计算服务)。 –

相关问题