2

我正在尝试将相当复杂的应用程序迁移到 Windows Azure。在辅助角色和 Web 角色中,有许多应用程序将文件保存到本地文件系统的实例。

这是一个例子:

string thumbnailFileName = System.IO.Path.GetDirectoryName(fileName) + "\\" + "bthumb_" + System.IO.Path.GetFileName(fileName);

thumbnail.Save(thumbnailFileName);

另一个例子:

 using (System.IO.StreamWriter file = System.IO.File.AppendText(GetCurrentLogFilePath()))
   {
     string logEntry = String.Format("\r\n{0} - {1}: {2}", DateTime.Now.ToString("yyyy.MM.dd@HH.mm.ss"), type.ToString(), message);
     file.Write(logEntry);

     file.Close();
   }

在这些示例中,我们将图像和日志文件保存到 app.config 中指定的文件位置。这是一个例子:

<add key="ImageFileDirectory" value="C:\temp\foo\root\auth\inventorypictures"/>

我希望尽可能少地更改代码以支持 Azure blob 存储,以防我们决定回到更传统的托管环境,更普遍地减少产生意外问题的可能性。

根据这篇文章,我认为 Azure Drive 不是最好的选择。

有人可以指导我正确的方向(最好举个例子)吗?我认为最好的解决方案是只需要更改我的配置文件。但我猜这不太现实。

4

2 回答 2

3

实际上,您希望使用 Azure Blob 存储来保存文件。

至于您的编码问题,请考虑创建一个接口,将其称为 IFileStore:

public interface IFileStore
{
   void Save(string filePath, byte [] contents);
   byte [] Read(string filePath);
}

然后创建 2 个提供程序类,一个用于文件系统,一个用于 Azure Blob 存储。

文件系统提供者可以像这样实现保存功能:

    public void Save(string filePath, byte [] content)
    {
        File.WriteAllBytes(filePath, content);
    }

    public byte [] Read(string filePath)
    {
        return File.ReadAllBytes(filePath);
    }

至于 Azure Blob 提供程序,您必须根据传入的 filePath 派生存储路径。

于 2011-07-21T17:13:11.950 回答
2

一般来说

对于您的存储,我建议使用 Blob 和表存储 - 这允许多个实例同时访问存储。如果您想帮助使代码可移植,那么我建议您在接口/API 后面抽象您的代码(请参阅@Philpp 的答案)。

例如

  • 对于您的日志文件示例,那么表存储可能是最好的选择
  • 对于您的图像文件,那么 Blob 存储可能是最好的选择

如果你真的想使用 AzureDrive

如果您只打算部署角色的单个实例,我只建议使用 AzureDrive - 否则您最终会遇到跨多个实例共享文件的问题(请记住,只有 1 个实例可以在任何一个实例上进行写入访问时间)

如果您使用单个实例进行操作,并且仅存储临时文件和日志文件,那么您还可以考虑使用本地存储而不是 azure 驱动器 - 它比 blob 存储更简单、更便宜。例如,对于您的日志文件示例,一种可能的专家替代方案是,您可以考虑使用本地存储以及 Azure 诊断控制的本地存储到 Blob 存储的上传。

于 2011-07-21T17:22:50.117 回答