从Azure存储中加载XDocument的正确方法是什么
我试图将我的站点的所有文件检索都移动到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>
那么最简单的方法,因为它的出现,是对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;
}
只有当问题中的blob可公开访问时(即包含Blob的容器具有Blob或Container容器ACL),此解决方案才能正常工作。如果容器ACL是'Private',那么您的代码将失败,因为匿名请求在这种情况下不会成功。顺便说一句,你是否尝试过我在评论中提到的解决方案? –
@Gaurav Mantri ...我试过你的解决方案,但没有奏效。我需要加载到XElement中的文件都是公开的,因此对于特定的应用程序,它可以根据需要运行。我有另一个问题加载文本文件,请参阅我的帖子在这里... http://*.com/questions/39018775/azure-blob-url-comes-back-incorrectly-for-text-file-load – dinotom
您是否收到任何错误的代码? –
@Gaurav Mantri ...我不会发布,否则,xml = blob.OpenRead行上的Azure存储异常。无论我尝试提取内容的方法是哪里,都会发生错误。在这个特定的实例中,错误是Microsoft.WindowsAzure.Storage.StorageException:远程服务器返回错误:(404)Not Found。 ...哪些男性没有意义,因为检查blob可以看到它拥有我请求的文件中的xml。 – dinotom
感谢您分享错误的详细信息。 404错误意味着未找到blob。我注意到这就是你如何引用blob:'var blob = sampleContainer.GetBlockBlobReference(@“files \”+ NavXmlFile);'。你可以改变它:'var blob = sampleContainer.GetBlockBlobReference(@“files /”+ NavXmlFile);'?如果您注意到,我将“\”更改为“/”。试试看看会发生什么。 –