2016-08-17 7 views
1

自分のサイトのすべてのファイル検索をAzureストレージに移動しようとしています(パスの問題により検索ファイルのエラーが発生しにくいと思われます)。これは聞こえるほど簡単ではありませんでした。私はストレージアカウントとコンテナに到達し、変数にブロブを読み込むことができますが、私はXDocumentに内容を取得する方法を見つけることができません。私は、blob変数のインテリセンスの下に表示されるファイルに関連するほとんどすべてのメソッドを試しました。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); 
    } 

私は、ウェブ上のどこかここSO上XDocumentまたはXElementのにロードするXMLファイルの内容のいずれかの例を見つけるように見えることはできません。どんな助けもありがたい。

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)が見つかりません。 ... blobを調べると、要求しているファイルからxmlが保持されていることがわかるので、男性は意味がありません。 – dinotom

+0

エラーの詳細を共有していただきありがとうございます。 404エラーはBLOBが見つからないことを意味します。私はこれがあなたがブロブを参照している方法であることに気づいた: 'var blob = sampleContainer.GetBlockBlobReference(@" files \ "+ NavXmlFile);'。それを次のように変更できますか? 'var blob = sampleContainer.GetBlockBlobReference(@" files/"+ NavXmlFile);'?気がついたら、 "\"を "/"に変更しました。試して何が起こるか見てみましょう。 –

答えて

0

まあ最も簡単な方法、それは結局のところは、同じように長いファイルが公にアクセス可能なように、のXElementにURLパスをロードすることです。あなたの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」または「コンテナ」ACLがある)場合にのみ機能します。コンテナACLが 'Private'の場合、匿名リクエストは成功しないため、コードは失敗します。ところで、あなたは私のコメントで述べた解決策を試しましたか? –

+0

@ Gaurav Mantri ...あなたのソリューションを試しましたが、うまくいかなかったのです。 XElementにロードする必要があるファイルはすべてpublicなので、その特定のアプリケーションの場合は必要に応じて動作します。私はテキストファイルをロードする別の問題を抱えています、私のポストを参照してください... http://stackoverflow.com/questions/39018775/azure-blob-url-comes-back-incorrectly-for-text-file-load – dinotom

関連する問題