Нашел несколько подсказок на официальном azure-storage-net репо:
Идея:
- создайте собственный класс, который наследуется от
DelegatingHandler
, чтобы установить там прокси
- используйте этот класс в вашем приложении
Реализация на основе вашего образца:
DelegatingHandlerImpl.cs (взято из https://github.com/Azure/azure-storage-net/blob/master/Test/Common/TestBase.Common.cs)
public class DelegatingHandlerImpl : DelegatingHandler
{
public int CallCount { get; private set; }
private readonly IWebProxy Proxy;
private bool FirstCall = true;
public DelegatingHandlerImpl() : base()
{
}
public DelegatingHandlerImpl(HttpMessageHandler httpMessageHandler) : base(httpMessageHandler)
{
}
public DelegatingHandlerImpl(IWebProxy proxy)
{
this.Proxy = proxy;
}
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
CallCount++;
if (FirstCall && this.Proxy != null)
{
HttpClientHandler inner = (HttpClientHandler)this.InnerHandler;
inner.Proxy = this.Proxy;
}
FirstCall = false;
return base.SendAsync(request, cancellationToken);
}
}
Queue.cs
public class Queue
{
public Queue(string connectionString, string queueName)
{
var storageAccount = CloudStorageAccount.Parse(connectionString);
var proxy = new WebProxy()
{
// More properties here
Address = new Uri("your proxy"),
};
DelegatingHandlerImpl delegatingHandlerImpl = new DelegatingHandlerImpl(proxy);
CloudQueueClient cloudQueueClient = new CloudQueueClient(storageAccount.QueueStorageUri, storageAccount.Credentials, delegatingHandlerImpl);
CloudQueue = cloudQueueClient.GetQueueReference(queueName);
}
private CloudQueue CloudQueue { get; }
public async Task<string> PeekAsync()
{
var m = await CloudQueue.PeekMessageAsync();
return m.AsString;
}
}
Успешно проверил это, когда я за нашим прокси.
Sidenote: удалите настройку App.config
для defaultProxy
, она не используется ядром dotnet.