2011-07-21 109 views
2

我試圖將相當複雜的應用程序遷移到Windows Azure。在工作者角色和Web角色中都有很多應用程序將文件保存到本地文件系統的實例。儘量減少遷移到Azure Blob存儲的代碼影響

下面是一個例子:

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("[email protected]"), 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不是最好的選擇。

有人可以引導我在正確的方向(理想情況下例如)?在我看來,最好的解決方案只需要改變我的配置文件。但我猜這是不現實的。

回答

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提供商,你將不得不爲:基於文件路徑傳遞到您的存儲路徑。

2

一般

爲您的存儲,我推薦使用Blob和表存儲 - 這允許多個實例同時訪問存儲。如果你想幫助使代碼可移植,那麼我建議在接口/ API之後抽象你的代碼(參見@ Philpp的答案)。

例如

  • 爲日誌文件示例,則表存儲可能是使用
  • 爲圖像文件的最好的事情,然後Blob存儲可能是最好的東西用

如果你真的想使用AzureDrive

我只建議使用AzureDrive,如果你只打算部署一個單一的喲你的角色 - 否則你最終會在跨多個實例共享文件時遇到問題(並且記住,在任何時候只有一個實例可以使用寫入訪問進行掛載)

如果您使用單個實例進行操作,並且只存儲臨時文件和日誌文件,那麼你也可以考慮使用本地存儲,而不是天藍色的驅動器 - 它比blob存儲更簡單,更便宜。例如日誌文件示例的一個可能的專業替代方案是,您可以考慮使用本地存儲以及Azure診斷 - 控制將本地存儲上傳到Blob存儲。