2016-08-17 95 views
1

我試圖將我的站點的所有文件檢索都移動到Azure存儲(據推測,由於路徑問題,檢索文件的可能性較小)。這聽起來不容易。我能夠到達存儲帳戶和容器並將blob加載到變量中,但我找不到任何方式將內容導入到XDocument中。我已經嘗試了幾乎所有與在我的blob變量的intellisense下顯示的文件相關聯的方法。從Azure存儲中加載XDocument的正確方法是什麼

[TestMethod] 
    public void TestMethod1() 
    { 
     var storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["azurestorageconn"]); 
     var client = storageAccount.CreateCloudBlobClient(); 
     //create a blob container with public accessibility 
     var sampleContainer = client.GetContainerReference(ConfigurationManager.AppSettings["azurecontainer"]); 
     sampleContainer.CreateIfNotExists(); 
     sampleContainer.SetPermissions(new BlobContainerPermissions() 
     { 
      PublicAccess = BlobContainerPublicAccessType.Blob 
     }); 
     var blob = sampleContainer.GetBlockBlobReference(@"files\" + NavXmlFile); 
     XDocument xDoc; 
     //tried almost everything here 
     using (var xml = blob.OpenRead()) 
     { 
      xDoc = XDocument.Load(xml); 
     } 

     Assert.IsNotNull(xDoc); 
    } 

我似乎無法找到進入的XDocument或的XElement的加載XML文件內容的任何實例在網絡上或任何地方SO這裏。任何幫助讚賞。

不是說它應該重要,但這裏是一個xml文檔的示例。

<Menus> 
    <Menu> 
    <MenuId>1</MenuId> 
    <ParentMenuId>0</ParentMenuId> 
    <MenuTitle>Home</MenuTitle> 
    <DisplayOrder>10</DisplayOrder> 
    <MenuAction>/Home/Index</MenuAction> 
    <MenuRoles></MenuRoles> 
</Menu> 
<Menu> 
    <MenuId>2</MenuId> 
    <ParentMenuId>0</ParentMenuId> 
    <MenuTitle>Languages</MenuTitle> 
    <DisplayOrder>20</DisplayOrder> 
    <MenuAction></MenuAction> 
    <MenuRoles></MenuRoles> 
</Menu> 
</Menus> 
+0

您是否收到任何錯誤的代碼? –

+0

@Gaurav Mantri ...我不會發布,否則,xml = blob.OpenRead行上的Azure存儲異常。無論我嘗試提取內容的方法是哪裏,都會發生錯誤。在這個特定的實例中,錯誤是Microsoft.WindowsAzure.Storage.StorageException:遠程服務器返回錯誤:(404)Not Found。 ...哪些男性沒有意義,因爲檢查blob可以看到它擁有我請求的文件中的xml。 – dinotom

+0

感謝您分享錯誤的詳細信息。 404錯誤意味着未找到blob。我注意到這就是你如何引用blob:'var blob = sampleContainer.GetBlockBlobReference(@「files \」+ NavXmlFile);'。你可以改變它:'var blob = sampleContainer.GetBlockBlobReference(@「files /」+ NavXmlFile);'?如果您注意到,我將「\」更改爲「/」。試試看看會發生什麼。 –

回答

0

那麼最簡單的方法,因爲它的出現,是對URL路徑只是加載到的XElement,只要文件是公開訪問。它只需要將Azure文件的url路徑硬編碼到您的程序中。如果您有數百個文件用於此目的,這可能會造成問題。

var filepath = "yourazurefilesurlpath" 
var doc = XElement.Load(filepath); 

我仍然想知道如何使用原始帖子中的方法來做到這一點。

更新:

這裏是如何做到這一點編程

var blob = AzureStorageMethods.GetAzureBlob(ConfigurationManager.AppSettings["publicfiles"], NavXmlFile); 
var doc = XElement.Load(blob.Uri.AbsoluteUri); 

這裏是團塊呼叫

public static CloudBlockBlob GetAzureBlob(string containername,string filename) 
    { 
     var creds = ConfigurationManager.AppSettings["azurestorageconn"]; 
     var azureStorage = CloudStorageAccount.Parse(creds); 
     var client = azureStorage.CreateCloudBlobClient(); 
     //create a blob container and make it publicly accessibile 
     var baseContainer = client.GetContainerReference(containername); 
     baseContainer.CreateIfNotExists(); 
     baseContainer.SetPermissions(new BlobContainerPermissions() 
     { 
      PublicAccess = BlobContainerPublicAccessType.Blob 
     }); 
     var blob = baseContainer.GetBlockBlobReference(filename); 
     return blob; 
    } 
+0

只有當問題中的blob可公開訪問時(即包含Blob的容器具有Blob或Container容器ACL),此解決方案才能正常工作。如果容器ACL是'Private',那麼您的代碼將失敗,因爲匿名請求在這種情況下不會成功。順便說一句,你是否嘗試過我在評論中提到的解決方案? –

+0

@Gaurav Mantri ...我試過你的解決方案,但沒有奏效。我需要加載到XElement中的文件都是公開的,因此對於特定的應用程序,它可以根據需要運行。我有另一個問題加載文本文件,請參閱我的帖子在這裏... http://stackoverflow.com/questions/39018775/azure-blob-url-comes-back-incorrectly-for-text-file-load – dinotom

相關問題