2017-03-08 8 views
0

認証された(JWTによる)GETリクエストで、Azureブロブに格納されているイメージが返されるようにしようとしています。ローカルマシンでプロジェクトを実行し、郵便配達員を使用して画像を要求すると、要求が通過し、私が要求した画像が取得されます。しかし、Azureにコードをデプロイして同じエンドポイントにヒットしたら、私は403を取得します。コードは、私がDownloadToStreamAsyncを呼び出す行で失敗します。私が使用しているコードは次のとおりです。Web APIリクエストでAzureブロブを取得しようとすると403エラーが発生する

public async Task<BlobDownloadModel> DownloadBlob(Guid blobId) 
    { 
     try 
     { 
      //get picture record 
      Picture file = await _media.GetPictureAsync(blobId); 

      await _log.CreateLogEntryAsync("got picture record"); 

      // get string format blob name 
      var blobName = file.PictureId.ToString() + file.Extension; 

      await _log.CreateLogEntryAsync("got name of blob " + blobName); 

      if (!String.IsNullOrEmpty(blobName)) 
      { 
       await _log.CreateLogEntryAsync("blob not empty"); 

       var blob = _container.GetBlockBlobReference(blobName); 

       await _log.CreateLogEntryAsync("got blob: " + blob.ToString()); 

       var ms = new MemoryStream(); 

       await blob.DownloadToStreamAsync(ms); 

       await _log.CreateLogEntryAsync("blob downloaded to memory stream"); 

       var lastPos = blob.Name.LastIndexOf('/'); 
       var fileName = blob.Name.Substring(lastPos + 1, blob.Name.Length - lastPos - 1); 

       var download = new BlobDownloadModel 
       { 
        BlobStream = ms, 
        BlobFileName = fileName, 
        BlobLength = blob.Properties.Length, 
        BlobContentType = blob.Properties.ContentType 
       }; 

       return download; 
      } 
     } 
     catch(Exception ex) 
     { 
      await _log.CreateLogEntryAsync("exception thrown: " + ex.ToString()); 
     } 

私は大いに喜んでいただけます。

UPDATE:

私はこれに私のコードを変更して再度試してみました:

public async Task<AzureBlobModel> DownloadBlob(Guid blobId) 
    { 
     try 
     { 
      //get picture record 
      Picture file = await _media.GetPictureAsync(blobId); 

      await _log.CreateLogEntryAsync("got picture record"); 

      // get string format blob name 
      var blobName = file.PictureId.ToString() + file.Extension; 

      await _log.CreateLogEntryAsync("got name of blob " + blobName); 

      if (!String.IsNullOrEmpty(blobName)) 
      { 
       await _log.CreateLogEntryAsync("blob not empty"); 

       var blob = _container.GetBlockBlobReference(blobName); 

       await _log.CreateLogEntryAsync("got blob: " + blob.ToString()); 

       // Strip off any folder structure so the file name is just the file name 
       var lastPos = blob.Name.LastIndexOf('/'); 
       var fileName = blob.Name.Substring(lastPos + 1, blob.Name.Length - lastPos - 1); 

       await _log.CreateLogEntryAsync("got fileName: " + fileName); 

       //await blob.DownloadToStreamAsync(ms); 

       await _log.CreateLogEntryAsync("about to open read stream"); 

       var stream = await blob.OpenReadAsync(); 

       await _log.CreateLogEntryAsync("opened read stream"); 

       var result = new AzureBlobModel() 
       { 
        FileName = fileName, 
        FileSize = blob.Properties.Length, 
        Stream = stream, 
        ContentType = blob.Properties.ContentType 
       }; 

       await _log.CreateLogEntryAsync("blob downloaded to memory stream"); 

       return result; 

       // Build and return the download model with the blob stream and its relevant info 
       //var download = new BlobDownloadModel 
       //{ 
       // BlobStream = ms, 
       // BlobFileName = fileName, 
       // BlobLength = blob.Properties.Length, 
       // BlobContentType = blob.Properties.ContentType 
       //}; 

       //return download; 
      } 
     } 
     catch(Exception ex) 
     { 
      await _log.CreateLogEntryAsync("exception thrown: " + ex.ToString()); 
     } 

     await _log.CreateLogEntryAsync("returning null"); 

     // Otherwise 
     return null; 
    } 

最後の試みのログからの結果がこれです:、

要求が受信され、認証されましたタイムスタンプUTC:3/10/2017 5:28:26 AM - 5:28:26 AM
id:b3bc7faf-0c86-4ce2-af84-30636825a485 - 5:28:27 AM
時28分27秒AM
BLOB空ではない - - 5時28分27秒AM
持っ27 AM
ブロブの名前b3bc7faf-0c86-4ce2-af84-30636825a485.JPGを得た:28:は、録画-5を得blob:Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob - 5:28:27 AM
got fileName:b3bc7faf-0c86-4ce2-af84-30636825a485.JPG - 5:28:27 AM
約ストリームを開く - 5 :28:27 AM

問題の原因となっている不正なアカウントキーを排除するファイル/ BLOBの名前を取得できました。私はアズールにコードを展開し、私が手に同じエンドポイントをヒットした後、しかし

public async Task<AzureBlobModel> DownloadBlob(Guid blobId) 
    { 
     try 
     { 
      //get picture record 
      Picture file = await _media.GetPictureAsync(blobId); 

      // get string format blob name 
      var blobName = file.PictureId.ToString() + file.Extension; 

      if (!String.IsNullOrEmpty(blobName)) 
      { 
       var blob = _container.GetBlockBlobReference(blobName); 

       // Strip off any folder structure so the file name is just the file name 
       var lastPos = blob.Name.LastIndexOf('/'); 
       var fileName = blob.Name.Substring(lastPos + 1, blob.Name.Length - lastPos - 1); 

       var fileLength = blob.Properties.Length; 
       var stream = await blob.OpenReadAsync(); 

       var result = new AzureBlobModel() 
       { 
        FileName = fileName, 
        FileSize = blob.Properties.Length, 
        Stream = stream, 
        ContentType = blob.Properties.ContentType 
       }; 

       return result; 
      } 
     } 
     catch(Exception ex) 
     { 
      await _log.CreateLogEntryAsync("exception thrown: " + ex.ToString()); 
     } 

     await _log.CreateLogEntryAsync("returning null"); 

     // Otherwise 
     return null; 
    } 

答えて

0

私は、次のコードを使用して問題を解決することができた:私は、アカウントの認証情報が正しいことを確認するためにチェックを倍増

public async Task<AzureBlobModel> DownloadBlob(Guid blobId) 
    { 
     try 
     { 
      //get picture record 
      Picture file = await _media.GetPictureAsync(blobId); 

      // get string format blob name 
      var blobName = file.PictureId.ToString() + file.Extension; 

      if (!String.IsNullOrEmpty(blobName)) 
      { 
       var blob = _container.GetBlockBlobReference(blobName); 

       // Strip off any folder structure so the file name is just the file name 
       var lastPos = blob.Name.LastIndexOf('/'); 
       var fileName = blob.Name.Substring(lastPos + 1, blob.Name.Length - lastPos - 1); 

       var fileLength = blob.Properties.Length; 
       var stream = await blob.OpenReadAsync(); 

       var result = new AzureBlobModel() 
       { 
        FileName = fileName, 
        FileSize = blob.Properties.Length, 
        Stream = stream, 
        ContentType = blob.Properties.ContentType 
       }; 

       return result; 
      } 
     } 
     catch(Exception ex) 
     { 
      await _log.CreateLogEntryAsync("exception thrown: " + ex.ToString()); 
     } 

     await _log.CreateLogEntryAsync("returning null"); 

     // Otherwise 
     return null; 
    } 
0

:私は次のコードに対応するためにコードを取得することができた

SOLUTION

a 403.

まず、Azureアカウントとキーが正しいことを確認してください。次に、サーバーの時計を確認してください。ストレージサービスは、要求がサービスに到達するまでに15分以上経過していないことを保証します。サーバーの時刻がストレージサーバーと同期していないと、403エラーが発生します。

+0

を。 WebサーバーとBLOBストレージは米国西海岸にあります。私はサーバー時間が同期されていると仮定しています。私は時代をチェックする方法を知っていますか? – chesco

+0

ストレージエミュレータを使用してテストしていますか? Azureに展開する場合は、必ずAzureストレージ接続で変更してください。また、アカウントキーが再生成されていないことを確認してください。サーバーの時刻を確認するのは簡単です。サーバーの時刻を取得して、時計が正しいことを確認してください。 –

+0

Jambor、私はアカウントキーが正しいことを確信しています。ローカルマシン上でAPIを実行してテストしました。ライブストレージアカウントからイメージを取得できました。私は先に進み、リクエストデータのスクリーンショットを撮ったhttps://24hr.cloudtimecards.com/File/Download/29021dd3-d1b8-4426-ab61-f061a340d855 また、私はAzureストレージの時間をチェックすることができませんでしたサーバ。私は運がないAzure Portalを見ました。 – chesco

関連する問題