我正在尝试向我在azure中托管的队列发送消息。我的应用程序通过代理与世界通信。我使用.Net Core 2.1和新的标准azure服务总线nuget。我需要通过端口443在网络套接字上使用Amqp。不幸的是我没有成功。是否有人实施了这样的事情?任何人都可以提供有关如何实现这一目标的代码段吗?
提前致谢!这是我正在尝试的:
var transportProvider = new AmqpTransportProvider();
var amqpSettings = new AmqpSettings
{
RequireSecureTransport = true, TransportProviders = {transportProvider}
};
var socketSettings = new WebSocketTransportSettings()
{
Proxy = new WebProxy() {Address = new Uri("http://myproxy"), BypassProxyOnLocal = false},
SubProtocol = "https",
Uri = new Uri($"wss://{_azureConfiguration.NameSpace}"),
};
AmqpTransportInitiator transportIntInitiator = new AmqpTransportInitiator(amqpSettings, socketSettings);
var b = transportIntInitiator.ConnectAsync(TimeSpan.FromSeconds(30), new TransportAsyncCallbackArgs());
ServiceBusConnection s = new ServiceBusConnection($"sb://{_azureConfiguration.NameSpace}", TransportType.AmqpWebSockets);
s.TokenProvider = tokenProvider;
s.OperationTimeout = TimeSpan.FromSeconds(30);
var sender = new MessageSender(s, _azureConfiguration.QueueName);
string messageBody = $"Message";
var message = new Message(Encoding.UTF8.GetBytes(messageBody));
await sender.SendAsync(message);
代码出现以下错误:无法连接到远程服务器。内部异常详细信息:连接尝试失败,因为连接方在一段时间后没有正确响应,或者由于连接主机无法响应而建立连接失败。
堆栈跟踪:
System.Net.WebSockets.WebSocketException(0x80004005):无法连接到远程服务器---> System.Net.Http.HttpRequestException:连接尝试失败,因为连接方在一段时间后没有正确响应,或者已建立连接失败,因为连接的主机无法响应---> System.Net.Sockets.SocketException:连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机无法响应在System.Net.Http.ConnectHelper.ConnectAsync(String host,Int32 port,CancellationToken cancellationToken)---内部异常堆栈跟踪结束---在System.Net.Http.ConnectHelper.ConnectAsync(String host,Int32 port,CancellationToken)在System.Net.Http.Http.HttpConnectionPool上的System.Threading.Tasks.ValueTask1.get_Result()
at System.Net.Http.HttpConnectionPool.CreateConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)
at System.Threading.Tasks.ValueTask
1.get_Result()处于System.Net.Http.HttpConnectionPool.WaitForCreatedConnectionAsync(ValueTask1 creationTask)
at System.Threading.Tasks.ValueTask
1.get_Result())在System.Net.WebSockets.WebSocketHandle.ConnectAsyncCore(Uri uri,CancellationToken cancellationToken,ClientWebSocketOptions选项)的System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage请求,CancellationToken cancellationToken)上的.SendWithRetryAsync(HttpRequestMessage请求,布尔doRequestAuth,CancellationToken cancellationToken)at at Microsoft.Azure.ServiceBus.Core.MessageSender.OnSendAsync(IList1 messageList) in C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\Core\MessageSender.cs:line 562
at Microsoft.Azure.ServiceBus.RetryPolicy.RunOperation(Func
1操作,TimeSpan operationTimeout)位于Microsoft.Azure的C:\ source \ azure-service-bus-dotnet \ src \ Microsoft.Azure.ServiceBus \ RetryPolicy.cs:第83行C:\ source \ azure-service-bus-dotnet \ src \ Microsoft.Azure.ServiceBus \ Core \ MessageSender.cs中的.ServiceBus.RetryPolicy.RunOperation(Func1 operation, TimeSpan operationTimeout) in C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\RetryPolicy.cs:line 105
at Microsoft.Azure.ServiceBus.Core.MessageSender.SendAsync(IList
1 messageList):第252行
确保您使用的是Microsoft.Azure.ServiceBus和函数Microsoft.Azure.WebJobs.Extensions.ServiceBus 3.x(我分别使用了3.4.0和3.0.4)。使用标准var messageSender = new MessageSender(queueConnectionString,queueName,RetryPolicy.Default);
只需将servicebus connectionstring更改为
端点= SB://yadayada.servicebus.windows.net/; SharedAccessKeyName = SenderPolicy; SharedAccessKey = yadayada; TransportType = AmqpWebSockets
并且它将使用websockets / https,因此使用端口443.抱歉没有让代理部分工作但是在印象中,如果它是在网络级别设置的,它将自动检测并且上述应该工作。还有一个继电器选项。如果我让它工作,我会更新,但我最初发现这篇文章只是试图让443 / ampqwebsockets工作。