我正在尝试将相当复杂的应用程序迁移到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不是最佳选择。
有人可以引导我朝着正确的方向前进(理想情况下是一个例子)吗?我认为最好的解决方案是只需要更改配置文件。但我猜这是不现实的。
答案 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。
如果您确实想使用AzureDrive
如果您只是要部署角色的单个实例,我建议您使用AzureDrive - 否则您将最终解决跨多个实例共享文件的问题(并且请记住,只有1个实例可以使用写访问权限进行安装在任何时候)
如果您使用单个实例进行操作,并且如果您只存储临时文件和日志文件,那么您还可以使用本地存储而不是天蓝色驱动器 - 它比blob存储更简单,更便宜。例如日志文件示例的一个可能的专业替代方案是,您可以考虑使用本地存储以及Azure诊断控制的将本地存储上载到Blob存储。