Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从Azure存储加载XDocument的正确方法是什么_C#_Azure_Azure Storage Blobs - Fatal编程技术网

C# 从Azure存储加载XDocument的正确方法是什么

C# 从Azure存储加载XDocument的正确方法是什么,c#,azure,azure-storage-blobs,C#,Azure,Azure Storage Blobs,我正在尝试将我的站点的所有文件检索移动到Azure存储(据说是为了减少由于路径问题检索文件时出错的可能性)。这过去/现在不像听起来那么容易。我能够访问存储帐户和容器并将blob加载到变量中,但我找不到任何方法将内容加载到XDocument中。我尝试了几乎所有与我的blob变量的intellisense下显示的文件相关联的方法 [TestMethod] public void TestMethod1() { var storageAccount = CloudSto

我正在尝试将我的站点的所有文件检索移动到Azure存储(据说是为了减少由于路径问题检索文件时出错的可能性)。这过去/现在不像听起来那么容易。我能够访问存储帐户和容器并将blob加载到变量中,但我找不到任何方法将内容加载到XDocument中。我尝试了几乎所有与我的blob变量的intellisense下显示的文件相关联的方法

[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);
    }
我似乎找不到任何将xml文件内容加载到web上或此处的XDocument或XElement中的示例。谢谢你的帮助

这并不重要,但这里是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>

1.
0
家
10
/主页/索引
2.
0
语言文字
20

事实证明,最简单的方法就是将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);
这是blob调用的代码

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;
    }

你有什么错误吗?@Gaurav Mantri…否则我不会发布,在xml=blob.OpenRead行上出现Azure存储异常。无论我尝试使用何种方法提取内容,都会发生错误。在此特定实例中,错误为Microsoft.WindowsAzure.Storage.StorageException:远程服务器返回错误:(404)未找到。。。这没有任何意义,因为通过检查blob,您可以看到它包含我请求的文件中的xml。感谢您分享错误详细信息。404错误意味着找不到blob。我注意到这就是您引用blob的方式:
var blob=sampleContainer.GetBlockBlobReference(@“files\”+NavXmlFile)。您可以将其更改为:
var blob=sampleContainer.GetBlockBlobReference(@“files/”+NavXmlFile)?如果您注意到,我将“\”改为“/”。试一试,看看会发生什么。在跨过var blob=sampleContainer之后,这个错误毫无意义。。。检查blob时,它确实包含文件中的xml,无论我尝试流、文本下载还是其他方式,都是将xml加载到xml变量失败。我将再次尝试您的建议和评论。只有当问题中的blob可公开访问时(即,包含blob的容器具有
blob
container
ACL),此解决方案才有效。如果容器ACL是私有的,那么您的代码将失败,因为在这种情况下匿名请求不会成功。顺便说一句,你尝试过我在评论中提到的解决方案吗?@Gaurav Mantri…我尝试过你的解决方案,但没有成功。我需要加载到XElement中的文件都是公共的,因此对于特定的应用程序,它可以根据需要工作。我有另一个问题加载文本文件,请参阅我的帖子这里。。。