認証された(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;
}
を。 WebサーバーとBLOBストレージは米国西海岸にあります。私はサーバー時間が同期されていると仮定しています。私は時代をチェックする方法を知っていますか? – chesco
ストレージエミュレータを使用してテストしていますか? Azureに展開する場合は、必ずAzureストレージ接続で変更してください。また、アカウントキーが再生成されていないことを確認してください。サーバーの時刻を確認するのは簡単です。サーバーの時刻を取得して、時計が正しいことを確認してください。 –
Jambor、私はアカウントキーが正しいことを確信しています。ローカルマシン上でAPIを実行してテストしました。ライブストレージアカウントからイメージを取得できました。私は先に進み、リクエストデータのスクリーンショットを撮ったhttps://24hr.cloudtimecards.com/File/Download/29021dd3-d1b8-4426-ab61-f061a340d855 また、私はAzureストレージの時間をチェックすることができませんでしたサーバ。私は運がないAzure Portalを見ました。 – chesco