Openstackdotnet SDK对象存储对象版本控制

时间:2015-12-03 09:53:00

标签: c# .net cloud storage openstack

我正在使用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");
}

这是创建启用版本控制的容器的正确方法吗?

1 个答案:

答案 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);
        }
    }
}