【问题标题】:Connection Timeout not working for Azure Storage Queue Client连接超时不适用于 Azure 存储队列客户端
【发布时间】:2017-11-04 01:00:13
【问题描述】:

我想知道为什么我不能设置超时。如果我无法在几秒钟内将消息提交到队列,我宁愿取消尝试并进行指数回退。

https://docs.microsoft.com/en-us/dotnet/api/microsoft.windowsazure.storage.queue.cloudqueue.addmessageasync?view=azure-dotnet

QueueRequestOptions queueRequestOptions = new QueueRequestOptions();
queueRequestOptions.ServerTimeout = TimeSpan.FromSeconds(3);

OperationContext operationContext = new OperationContext();
OperationContext.DefaultLogLevel = Microsoft.WindowsAzure.Storage.LogLevel.Verbose;
operationContext.ClientRequestID = correlationId;
operationContext.CustomUserAgent = "myCallerId";

await queue.AddMessageAsync(message, null, null, queueRequestOptions, operationContext);

不完全漂亮,但也没有完成它的工作:( 如果我为存储帐户设置了错误的 dns 名称,请求不会按预期在 3 秒后超时。

鉴于在后台有一个 HttpClient,应该可以为 http 调用设置超时。

CloudQueueClient cloudQueueClient = _cloudStorageAccount.CreateCloudQueueClient();
cloudQueueClient.DefaultRequestOptions.ServerTimeout = TimeSpan.FromSeconds(3);

那也不行。

与此同时,我查看了 Azure Storage SDK 的源代码:

namespace Microsoft.WindowsAzure.Storage.Shared.Protocol
{
    internal static class HttpClientFactory
    {
    [CompilerGenerated]
    [Serializable]
    private sealed class <>c
    {
        public static readonly HttpClientFactory.<>c <>9 = new HttpClientFactory.<>c();

        internal HttpClient cctor>b__3_0()
        {
            HttpClient expr_0B = new HttpClient(StorageAuthenticationHttpHandler.Instance, false);
            expr_0B.get_DefaultRequestHeaders().set_ExpectContinue(new bool?(false));
            expr_0B.get_DefaultRequestHeaders().get_UserAgent().Add(new ProductInfoHeaderValue("Azure-Storage", "8.5.0"));
            expr_0B.get_DefaultRequestHeaders().get_UserAgent().Add(new ProductInfoHeaderValue(Constants.HeaderConstants.UserAgentComment));
            expr_0B.get_DefaultRequestHeaders().TryAddWithoutValidation("x-ms-version", "2017-04-17");
            expr_0B.set_Timeout(Timeout.InfiniteTimeSpan);
            return expr_0B;
        }
    }

    private static Lazy<HttpClient> instance = new Lazy<HttpClient>(new Func<HttpClient>(HttpClientFactory.<>c.<>9.<.cctor>b__3_0));

    public static HttpClient Instance
    {
        get
        {
            return HttpClientFactory.instance.get_Value();
        }
    }
}
}

因此正在设置超时。到无限。而且我找不到任何将超时设置为不同值的地方。这可能是真的吗? -.-

【问题讨论】:

    标签: c# azure-storage-queues


    【解决方案1】:

    尝试设置 queueRequestOptions.MaximumExecutionTime。那是客户端超时。服务器超时被传递给服务,而不是在客户端上强制执行。

    更多详情请见https://docs.microsoft.com/en-us/azure/architecture/best-practices/retry-service-specific#azure-storage-retry-guidelines

    【讨论】:

    • 感谢您指出内置的重试策略“阻止”我们设置简单的超时值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多