【问题标题】:how to upload file to OpenStack Swift in .net / Windows phone如何在 .net / Windows phone 中将文件上传到 OpenStack Swift
【发布时间】:2016-03-08 05:25:39
【问题描述】:

我已经与 .net/windows 8.1 应用程序建立了 openstack swift 连接,但我找不到任何方法来使用 windows 8.1 应用程序/.net 上传文件或创建对象到 openstack swift

请帮助我如何将文件上传到 openstack swift。

【问题讨论】:

  • 到目前为止你有什么尝试?
  • 您找到解决方案了吗?

标签: .net c#-4.0 windows-phone-8.1 windows-applications openstack-swift


【解决方案1】:

对此没有简单的答案。实际上,我正在认真考虑为 .NET 编写一个 swift 客户端库,以帮助促进更多针对 swift 的 .NET 开发。

但就目前而言,您必须与它进行交互,就像您没有库的任何其他随机 REST API 一样:

  1. 实例化一个 HTTPWebRequest 并按照the object API documentation 中的描述构建 URL 和标头。
  2. 响应正文通常是 JSON(除了一两个例外情况,您必须手动解析或搜索结果)。因此,请使用 JSON(反)序列化器将响应转换为您可以轻松使用的表格。

会话的一般流程是:

  1. 根据the authentication API documentation进行认证。
  2. 从响应中解析出身份验证令牌(不是 JSON)。
  3. 在以后的 GET/PUT 请求中使用该令牌。
  4. 请记住,令牌将在 24 小时后过期,您将收到“拒绝访问”错误。因此,请确保您的代码知道重做身份验证请求以获取新令牌。

使用curl 在代码之外测试您的 API 调用,以确认请求需要哪些标头以及它们应该具有哪些值。如果您无权访问 Linux 机器,您可以安装 curl for windows,或通过 cygwin 获取。

如果你这样做,请创建 github 项目并分享它,如果可以的话。您可能会发现自己和其他人愿意加入并帮助您!

其他选择:

  1. 在您的应用旁边安装swift command-line client 并调用它。这将简化身份验证过程和大型对象(DLO 和 SLO)的管理,但不会有很多其他方面。
  2. 使用 FUSE 驱动程序将 swift 容器挂载为 Windows 驱动器号,然后像文件系统一样与它通信。这里的问题是所有开源的 swift FUSE 驱动程序都有问题。所以你最终会想要一个你付钱的客户。 Storage Made Easy 和 CloudBerry 都有运行良好的产品。另一种选择是安装 S3 API 中间件 (Swift3),然后使用开源 S3 FUSE 驱动程序。这是众所周知的。但涉及的设置更多。
  3. 在对象存储前安装 swift 或 S3 兼容网关,并将容器公开为 SMB 或 NFS 共享。没有可用的免费选项,但 SoftNAS 提供了一款出色的产品,价格合理。

【讨论】:

  • 在 Linux 中,您可以通过发出以下命令以程序方式返回身份验证密钥(用于 v1.0 身份验证):curl -i $ST_AUTH -H "X-Auth-User: $ST_USER" -H "X-Auth-Key: $ST_KEY" 2> /dev/null | awk '{ if($1=="X-Auth-Token:") { print $2 } }' 设置环境变量 ST_AUTHST_USERST_KEY分别到身份验证 URL、用户名和密码。
【解决方案2】:

我为此开发了一个 .Net Standard 客户端,并实现了 WPF 演示和 ASP.NET Core 演示。 它包括 OpenStack Identity 的身份验证,以及 OpenStack 切换的大部分操作:

NetSwiftClient

我希望它易于使用,在这种情况下:

var c = new SwiftClient();

if(!await AuthenticateIfNeededAsync())
{
    Log($"Could not authenticated: could not retrieve a valid token");
    return;
}

c.InitToken(Token);

var file = System.IO.File.OpenRead(NewFileSource);
string contentType = "application/octet-stream";
contentType = MimeTypeMap.GetMimeType(System.IO.Path.GetExtension(NewFileSource));

var resp = await c.ObjectPutAsync(ObjectStoreUrl, Container, NewFileName, file, contentType);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2012-05-29
    • 2012-01-14
    • 2015-04-24
    • 2013-10-10
    • 2019-06-26
    • 1970-01-01
    相关资源
    最近更新 更多