4

ClickOnceインストールを通常のWebサーバーからAzureBlobストレージに移動していますが、一部のファイルに問題があります。ファイル名には次のものが含まれ、例外が発生して失敗します[ ]CloudBlob.UploadFile

Microsoft.WindowsAzure.Storageclient.StorageException:
BLOBストレージへのアクセス中にエラーが発生しました:サーバーが要求を認証できませんでした。Authorizationヘッダーの値が署名を含めて正しく形成されていることを確認してください。

このコードはしばらくの間使用されており[ ]、名前に含まれるファイルでのみ失敗するため、「認証の失敗」ではないと思います。この特定のケースでは、これはループでアップロードされる7番目のファイルです。有効なファイル名とスタックオーバーフローに関するこのリンクをMSDNで見つけました。どちらも、URLと参照の角かっこに関する問題を示していますUrlEncode。私はへの呼び出しを追加しましたがUrlEncode、それは役に立ちませんでした。コンテナは、ソフトウェアの顧客ダウンロードをサポートするために使用されるため、パブリックアクセスで作成されます。別のコンテナで「テスト」インストールをホストしており、それにアクセスするための権限の問題も発生していません。

名前を変更せずにファイルをアップロードしてから、newdesicのAzure Storage Explorerツールを使用してファイルの名前を変更し、「パス」を追加できます。

4

2 に答える 2

8

1.7 SDK を使用しているようです。これは、v2.0 にも存在する SDK のエンコードに関する小さな問題です。しばらく様子を見てみましょう。

エンコードなし

account.CreateCloudBlobClient()
       .GetContainerReference("temp")
       .GetBlobReference("abc[]def.txt")
       .UploadFile("myfile.txt");

BLOB 名をエンコードしないと、次の URL への要求が発生し、認証例外が発生します。

http://account.blob.core.windows.net/temp/abc[]def.txt

これは、SDK がUri.EscapeUriString文字列をエンコードするために内部的に使用するためですが、これは角かっこを考慮していません。

エンコーディング

次に、次のようにしてトリックを実行することを期待します。

account.CreateCloudBlobClient()
       .GetContainerReference("temp")
       .GetBlobReference(HttpUtility.UrlEncode("abc[]def.txt"))
       .UploadFile("myfile.txt");

ここでの問題は、次の URL になってしまうことです。

http://account.blob.core.windows.net/temp/abc%255b%255ddef.txt

ここで何が起こっているのでしょうか?HttpUtility.UrlEncode を呼び出すと、abc[]def.txtabc%5B%5Ddef.txtに変わります。これは正しいです。ただし、内部的に、SDK はこの文字列を再度エンコードし、結果としてabc%255b%255ddef.txtが生成されますが、これは望ましくありません。

回避策

角括弧を考慮するエンコーディングを適用する唯一の方法は、小さな回避策を使用することです。完全な URL を GetBlobReference メソッドに渡すと、SDK はすべてのエンコードを自分で行ったと見なします。

var container = account.CreateCloudBlobClient().GetContainerReference("temp");
var blob = container.GetBlobReference(String.Format("{0}/{1}", 
                container.Uri, System.Web.HttpUtility.UrlEncode("abc[]def.txt")));
blob.UploadFile("myfile.txt");

これにより、正しくエンコードされた URL が生成されます。

http://account.blob.core.windows.net/temp/abc%5b%5ddef.txt

また、CloudXplorer などのツールを使用すると、正しいファイル名の BLOB が表示されます。

ここに画像の説明を入力

于 2012-12-03T20:35:26.663 に答える