0

Microsoft.WindowsAzure.Storage 2.1.0.3 の使用

ある Azure ストレージ アカウントから別のアカウントにドキュメントを移動するコンソール アプリを作成しようとしています。アプリは、sourceClient.ListContainers() を使用してすべてのコンテナーを一覧表示し、foreach ブロック内のすべてのコンテナーをループ処理して、それぞれの共有アクセス トークンを取得し、各 BLOB に対して StartCopyFromBlob 要求を発行します。宛先 BLOB の名前付け構造は同じですが、アカウントが異なります (例: sourceAzureUrl/testContainer/filename.ext -> destAzureUrl/testContainer/filename.ext)。

ほとんどのファイル (98%) は正常にコピーされますが、特定の要求が送信されると、「リモート サーバーがエラーを返しました: (403) 許可されていません」という例外が返されます。宛先 BLOB への CloudBlockBlob 参照が作成されると、URL が正しく URL エスケープされていないようで、例外が発生します。ただし、このコードが MVC コントローラー内で実行されると、リクエストは何とか適切に URL エスケープされ、リクエストはエラーなしで完了します。コピーされた BLOB には、エスケープされていない名前も含まれています。

その理由は、ブロブ/ファイル名に「[」および/または「]」文字が含まれているためと思われます (例: Roger_Smith[1].doc)。ファイル名が事前に URL エンコードされている場合、要求はエラーなしで完了しますが、Azure Storage 内のファイル名は、元のファイル名ではなく、URL エスケープされた化身です (Roger_Smith[1].doc ではなく、Roger_Smith%255b1%255d.doc)。

コピー要求を適切に URL エスケープし、結果の blob にエスケープされていない名前を付ける方法はありますか?

4

1 に答える 1