最大限度地减少迁移到Azure Blob存储的代码影响

时间:2011-07-21 17:03:45

标签: c# asp.net azure azure-storage-blobs

我正在尝试将相当复杂的应用程序迁移到Windows Azure。在worker角色和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存储,以防我们决定回到更传统的托管环境,更普遍地减少创建意外问题的可能性。

基于此post,我认为Azure Drive不是最佳选择。

有人可以引导我朝着正确的方向前进(理想情况下是一个例子)吗?我认为最好的解决方案是只需要更改配置文件。但我猜这是不现实的。

2 个答案:

答案 0 :(得分: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派生存储路径。

答案 1 :(得分:2)

<强>一般

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

e.g。

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

如果您确实想使用AzureDrive

如果您只是要部署角色的单个实例,我建议您使用AzureDrive - 否则您将最终解决跨多个实例共享文件的问题(并且请记住,只有1个实例可以使用写访问权限进行安装在任何时候)

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