SAS キーの有効期限が切れたときに、StorageException から "AuthenticationFailed" エラー コード (キャッチ ブロック内) をキャプチャできます。次に、SAS 生成メソッドを (catch ブロック内で) 別の呼び出しを行い、有効期限が後の新しい SAS キーを作成します。新しい SAS キーを取得したら、それを使用して別の CloudBlockBlob オブジェクトを作成し、失敗したブロックを Azure BLOB に書き込みます。ただし、SAS キーの有効期限が切れた場合と同じ「403 禁止」認証エラーが発生し続けます。別の SAS キーを使用して新しい CloudBlockBlob オブジェクトを作成しているときに (有効期限が後で)、この問題が発生するのはなぜですか? SAS キー生成で「StartTime」を指定していないため、クロック スキューとは関係ありません。何か案は?SAS の更新を処理するためのより良い方法はありますか? 助けていただければ幸いです!以下は私のコードです。注: アップロードを分割するために JavaScript を使用しているため、WriteBlock メソッドを呼び出すたびに新しい状態になります。
/// Sends the file chunk to the Azure Blob
/// <param name = "BlockId">The id for the current block</param name>
public void WriteBlockToBlob(string BlockId)
{
try
{
Blob = new CloudBlockBlob(new Uri(BlobSasUri));
Blob.PutBlock(
BlockId,
File.InputStream,
null,
null,
uploadBlobOptions,
null
);
/***********************************************************************************************/
/* REST API Approach */
//string queryString = (new Uri(abm.BlobContainerSasUri)).Query;
//abm.BlobContainer = abm.BlobContainerSasUri.Substring(0, abm.BlobContainerSasUri.Length - queryString.Length);
//string requestUri = string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}/{1}{2}&comp=block&blockid={3}",
// abm.BlobContainer, abm.FileName, queryString, Convert.ToBase64String(Encoding.UTF8.GetBytes(abm.BlockId)));
//HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUri);
//request.Method = "PUT";
//request.ContentLength = abm.File.InputStream.Length;
//using (Stream requestStream = request.GetRequestStream())
//{
// inputStream.CopyTo(requestStream);
//}
//using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse())
//{
//}
/******************************************************************************************************/
}
catch (StorageException stex)
{
if (stex.RequestInformation.ExtendedErrorInformation.ErrorCode.Equals("AuthenticationFailed"))
{
AzureStorageTester ast = new AzureStorageTester();
BlobSasUri = ast.getStorageLibrarySas(File.FileName);
// Retry writing block to blob
Blob = new CloudBlockBlob(new Uri(BlobSasUri));
try
{
Blob.PutBlock(
BlockId,
File.InputStream,
null,
null,
uploadBlobOptions,
null
);
}
catch (StorageException ex)
{
var test = stex.RequestInformation.ExtendedErrorInformation.ErrorCode;
throw ex;
}
}
//string errMsg = ComposeAndLogStorageException(ExceptionFlag.UploadLargeFileException, stex);
//BigFileExceptionFlag = "on";
//throw new ApplicationException(errMsg);
}
catch (SystemException se)
{
string errMsg = ComposeAndLogSystemException(ExceptionFlag.UploadLargeFileException, se);
BigFileExceptionFlag = "on";
throw new ApplicationException(errMsg);
}
catch (Exception ex)
{
string errMsg = ComposeAndLogException(ExceptionFlag.UploadLargeFileException, ex);
BigFileExceptionFlag = "on";
throw new ApplicationException(errMsg);
}
finally
{
File.InputStream.Close();
}
}