2

お手数をおかけしますが、よろしくお願いいたします。

Azureクライアントライブラリ(CloudStorageAccount-CloudBlobClient-CloudBlob)を使用して、WPFアプリケーションでBLOBをダウンロード/アップロードしています。

WPFクライアントアプリケーションでタイムアウトセッションを設定して、クラウドBLOBの取得の試行を中止したいと思います。これは、BLOB転送セッションで設定できるサーバー側のタイムアウトとは異なります。アプリケーションが使用されるインターネット接続は非常に不安定な断続的な接続があるため、これを実行したいと思います。

つまり、実際のデータ転送の前にBlobContainer.FetchAttributesを実行して、インターネット接続を確認しようとしています。接続がない場合、タイムアウトして例外がスローされるまで90奇数秒待ちたくありません。

すでにBlobRequestOptionsでタイムアウトを設定しようとしましたが、接続が確立された場合にのみ適用できるため、これは機能しません。

設定が間違っていることを理解しましたか、それともより速いタイムアウトを達成するためにセットアップ/構成/コード化する必要がある何かがありますか?

Fiddlerで、StorageClientライブラリが舞台裏でHTTPを使用していることがわかります。私が読んだいくつかの投稿によると、以下に示すようにapp.configでタイムアウトを設定しようとしました。これもうまくいきませんでした。

<configuration>
  <system.web>
    <httpRuntime executionTimeout="5" />  
  </system.web>
</configuration>

BlobRequestオプションを使用したサンプルタイムアウト:

CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
blobContainer = blobClient.GetContainerReference("abcd");
CloudBlob blob = blobContainer.GetBlobReference(aCloudPath);
BlobRequestOptions bro = new BlobRequestOptions() 
                           { Timeout = TimeSpan.FromSeconds(5) };
blob.DownloadToFile(aLocalPath, bro);

どちらのオプションも機能しません!!

4

1 に答える 1

3

まず、app.configでhttpRuntimeexecutionTimeoutを変更しても機能しません。これは、ASP.NETによってサーバー側で使用される設定です。

次に、BlobRequestOptionsを使用したコードは機能するはずですが、注意点があります。デフォルトでは、BlobClientには、一時的な状態(つまり、ネットワークアクセスなし)を処理するための指数バックオフ再試行ポリシーが付属しています。各再試行の間に、少し待ってから再試行します。

ネットワークアクセスを確認するときにこれを無効にする場合は、再試行ポリシーを無効にするだけです。

        blobClient.RetryPolicy = () =>
        {
            return (int currentRetryCount, Exception lastException, out TimeSpan retryInterval) =>
            {
                retryInterval = TimeSpan.Zero;
                return false;
            };
        };

ネットワークアクセスをテストする場合にのみこれを無効にしてください。実際のリクエストでは無効にしないでください。

ちなみに、インターネット接続を確認するために、既存のものを使ってみませんか?InternetCheckConnectionなど、Windowsで使用できるAPIがいくつかあります。

また、接続が不安定な場合は、再試行ポリシーを無効にするのではなく、改善することをお勧めします(たとえば、 TOPAZを参照してください)。

于 2012-10-08T10:54:59.500 に答える