我正在使用OpenStack SDK .NET开发云备份客户端。在我的previous question中,我遇到了识别问题,并且解决了这个问题。现在我测试了几乎所有我需要的功能,但有一件事似乎不能正常工作。 我需要在对象存储swift中创建对象版本控制的功能。我在正式的Openstack文档中读到我需要向Rest添加标题:
X-Versions-Location: myversionlocation
在我的库中,我修改了用于创建容器的方法:
public void CreateContainer(string _containerName)
{
filesProvider.CreateContainer(_containerName, null, null, false, null);
}
为:
public void CreateContainer(string _containerName)
{
Dictionary<string, string> versioningHeader = new Dictionary<string, string>();
versioningHeader.Add("X-Versions-Location", "versions");
filesProvider.CreateContainer(_containerName, versioningHeader, null, false, null);
}
当我在容器中上传文件时没有问题,但是当我第二次上传文件时,我的应用程序会在此行中抛出ResponseException:{&#34;意外的HTTP错误:PreconditionFailed&#34;}:
public void UploadFile(string _containerName, string _fileName, ThrottledStream _stream)
{
filesProvider.CreateObject(_containerName, _stream, _fileName, null, 4096, null, "RegionOne");
}
这是创建启用版本控制的容器的正确方法吗?
答案 0 :(得分:0)
根据该错误,您是否可能在创建对象时发送“if-none-match”标头?设置该标头后,如果您尝试上载容器中已存在的文件,则会引发该错误。我不相信你可以在版本控制中使用那个标题,因为检查是基于名称,而不是正在上传的内容的文件哈希。只是一个猜测。 : - )
下面是一个控制台应用程序,它在上传新版本之前上传文件两次,以证明这应该有效。
using System;
using System.Collections.Generic;
using net.openstack.Core.Domain;
using net.openstack.Core.Providers;
using net.openstack.Providers.Rackspace;
namespace CloudFilesVersioning
{
class Program
{
static void Main(string[] args)
{
var identityUrl = new Uri("{identity-url}");
var identity = new CloudIdentityWithProject
{
Username = "{user}",
ProjectName = "{project-name}",
Password = "{password}"
};
const string region = "RegionOne";
var identityProvider = new OpenStackIdentityProvider(identityUrl, identity);
var filesProvider = new CloudFilesProvider(null, identityProvider);
// Create versions container
const string versionContainerName = "mycontainer-versions";
filesProvider.CreateContainer(versionContainerName, region: region);
// Create main container
const string containerName = "mycontainer";
var headers = new Dictionary<string, string>
{
{"X-Versions-Location", versionContainerName}
};
filesProvider.CreateContainer(containerName, headers, region);
// Upload the initial file
filesProvider.CreateObjectFromFile(containerName, @"C:\thing-v1.txt", "thing.txt", region: region);
// Upload the same file again, this should not create a new version
filesProvider.CreateObjectFromFile(containerName, @"C:\thing-v1.txt", "thing.txt", region: region);
// Upload a new version of the file
filesProvider.CreateObjectFromFile(containerName, @"C:\thing-v2.txt", "thing.txt", region: region);
}
}
}