连接到代理后面的 Azure 存储队列
Connect to Azure Storage Queue Behind Proxy
我有一个 .NET Core 2.2 控制台应用程序可以连接到 Azure 存储队列。它可以在我的电脑上运行,但我无法让它在公司代理后面运行。我需要做什么? (我匿名了存储帐户名称和密钥以及代理主机名。)
.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<LangVersion>8.0</LangVersion>
<NullableContextOptions>enable</NullableContextOptions>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Azure.Management.Fluent" Version="1.21.0" />
<PackageReference Include="Microsoft.Azure.Storage.Queue" Version="10.0.1" />
</ItemGroup>
</Project>
包装器class:
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Queue;
using System.Threading.Tasks;
namespace Queue
{
public class Queue
{
public Queue(string connectionString, string queueName)
{
var storageAccount = CloudStorageAccount.Parse(connectionString);
var cloudQueueClient = storageAccount.CreateCloudQueueClient();
CloudQueue = cloudQueueClient.GetQueueReference(queueName);
}
private CloudQueue CloudQueue { get; }
public async Task<string> PeekAsync()
{
var m = await CloudQueue.PeekMessageAsync();
return m.AsString;
}
}
}
AppSettings.json
{
"StorageConnectionString": "DefaultEndpointsProtocol=https;AccountName=someAccount;AccountKey=someKey==;EndpointSuffix=core.windows.net"
}
App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.net>
<defaultProxy enabled="true" useDefaultCredentials="true">
<proxy
usesystemdefault="True"
proxyaddress="http://someProxy:8080"
/>
</defaultProxy>
</system.net>
</configuration>
在官方 azure-storage-net 回购中找到了一些提示:
想法:
- 创建一个继承自
DelegatingHandler
的自定义 class 以在那里设置代理
- 在您的应用程序中使用 class
根据您的样本实施:
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;
}
}
当我在我们的代理后面时成功测试了这个。
旁注:删除 defaultProxy
的 App.config
设置,dotnet 核心不使用它。
我有一个 .NET Core 2.2 控制台应用程序可以连接到 Azure 存储队列。它可以在我的电脑上运行,但我无法让它在公司代理后面运行。我需要做什么? (我匿名了存储帐户名称和密钥以及代理主机名。)
.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<LangVersion>8.0</LangVersion>
<NullableContextOptions>enable</NullableContextOptions>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Azure.Management.Fluent" Version="1.21.0" />
<PackageReference Include="Microsoft.Azure.Storage.Queue" Version="10.0.1" />
</ItemGroup>
</Project>
包装器class:
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Queue;
using System.Threading.Tasks;
namespace Queue
{
public class Queue
{
public Queue(string connectionString, string queueName)
{
var storageAccount = CloudStorageAccount.Parse(connectionString);
var cloudQueueClient = storageAccount.CreateCloudQueueClient();
CloudQueue = cloudQueueClient.GetQueueReference(queueName);
}
private CloudQueue CloudQueue { get; }
public async Task<string> PeekAsync()
{
var m = await CloudQueue.PeekMessageAsync();
return m.AsString;
}
}
}
AppSettings.json
{
"StorageConnectionString": "DefaultEndpointsProtocol=https;AccountName=someAccount;AccountKey=someKey==;EndpointSuffix=core.windows.net"
}
App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.net>
<defaultProxy enabled="true" useDefaultCredentials="true">
<proxy
usesystemdefault="True"
proxyaddress="http://someProxy:8080"
/>
</defaultProxy>
</system.net>
</configuration>
在官方 azure-storage-net 回购中找到了一些提示:
想法:
- 创建一个继承自
DelegatingHandler
的自定义 class 以在那里设置代理 - 在您的应用程序中使用 class
根据您的样本实施:
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;
}
}
当我在我们的代理后面时成功测试了这个。
旁注:删除 defaultProxy
的 App.config
设置,dotnet 核心不使用它。