连接超时不适用于 Azure 存储队列客户端
Connection Timeout not working for Azure Storage Queue Client
我想知道为什么我不能设置超时。如果我不能在几秒钟内将消息提交到队列,我宁愿取消尝试并进行指数回退。
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();
}
}
}
}
因此正在设置超时。到无限。而且我找不到将超时设置为不同值的任何地方。这是真的吗? -.-
尝试设置 queueRequestOptions.MaximumExecutionTime。那是客户端超时。服务器超时会传递给服务,不会在客户端强制执行。
我想知道为什么我不能设置超时。如果我不能在几秒钟内将消息提交到队列,我宁愿取消尝试并进行指数回退。
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();
}
}
}
}
因此正在设置超时。到无限。而且我找不到将超时设置为不同值的任何地方。这是真的吗? -.-
尝试设置 queueRequestOptions.MaximumExecutionTime。那是客户端超时。服务器超时会传递给服务,不会在客户端强制执行。