web-dev-qa-db-ja.com

Microsoft.Azure.ServiceBusでAzure ServiceBusに接続できません

Azure ServiceBusに接続して1つのメッセージを送信する非常にシンプルなコンソールアプリケーションを作成しました。マイクロソフトの最新ライブラリを試しました(Microsoft.Azure.ServiceBus)しかし、私が何をしても、このエラーが発生します:

ターゲットマシンがアクティブに拒否したため、接続を確立できませんでした。ErrorCode:ConnectionRefused

Service Bus Explorerでまったく同じ接続文字列を試しましたが、うまく機能します。さらに、Microsoftの古いライブラリ(WindowsAzure.ServiceBus)。

var sender = new MessageSender("endpoint", "topicName");
sender.SendAsync(new Message(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject("test"))));

同じ例外で、.NET Framework 4.6.2とCoreを試しました。これらのライブラリが使用するデフォルトのプロトコルにはいくつかの違いがあると思いますが、確かにそれを理解することはできませんでした。

追伸 Microsoft docs の例を試しましたが、結果は同じ例外です

12

古いクライアントは、TCP、HTTP、HTTPS、およびConnectivityModeを使用して AutoDetect をサポートしていました。 ServiceBus ExplorerはAutoDetectを使用し、TCPを最初に試行してから、使用しているTransportMode(SBMPまたはAMQP)に関係なくHTTPSにフェイルオーバーします。

新しいクライアントではこれが変わりました。 TransportModeは両方のオプションを組み合わせ、Amqp(AMQP over TCP)またはAmqpWebSockets(AMQP over WebSockets)を提供するようになりました。 AutoDetectモードはありません。クライアントを作成し、TransportTypeAmqpWebSockets として指定して、ブロックされたTCPポート5671をバイパスし、代わりにポート443を使用する必要があります。

12
Sean Feldman

ドキュメントにはHTTPS(Amqp over WebSockets)を使用して接続する方法に関する多くの情報がないようですが、Sean Feldmanの助けを借りて 受け入れられた回答 接続に成功しました。これは、誰かが興味を持っている場合に使用したコードです。

var tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(
    "RootManageSharedAccessKey", // SharedAccessKeyName
    "SomeToken");

var sender = new MessageSender(
    "sb://mydomain.servicebus.windows.net/",
    "topicName",
    tokenProvider,
    TransportType.AmqpWebSockets);

または、接続文字列全体を1つのピースにまとめるバリアント

var builder = new ServiceBusConnectionStringBuilder("YouConnectionString");

var tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(
    builder.SasKeyName,
    builder.SasKey);

var sender = new MessageSender(
    builder.Endpoint,
    "TopicName",
    tokenProvider,
    TransportType.AmqpWebSockets);

ConnectionStringを直接使用することは実際には可能ですが、適切なプロトコルを使用するように拡張する必要があります。

var sender = new MessageSender("TransportType=AmqpWebSockets;Endpoint=...", "TopicName")

またはEntityPathをConnectionStringに埋め込むことができるバージョン

var connectionBuilder = new ServiceBusConnectionStringBuilder("EntityPath=MyTopic;TransportType=AmqpWebSockets;Endpoint=...")
var sender = new MessageSender(connectionBuilder);
10