2016-08-17 97 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

相关问题