Rebus集成Azure ServiceBus实现Pub/Sub时出现400错误求助
Rebus切换到Azure ServiceBus后出现400 Bad Request错误
我正在探索Rebus库,已在Microsoft.NET.Sdk.Worker项目中通过FileSystem传输成功实现Pub/Sub,但切换到Azure ServiceBus时遇到问题。
配置代码(Program.cs)
IHost host = Host.CreateDefaultBuilder(args) .ConfigureServices((context, services) => { services.AddLogging(); services.AddRebus( (config, provider) => { config .Logging(l => l.Console()) .Routing(r => r.TypeBased().MapAssemblyOf<CreateNewReportMessage>(busConfig.MainQueue)) //.Transport(x => x.UseFileSystem(busConfig.FileSystemTransportBaseDirectory, busConfig.MainQueue)) //.Subscriptions(x => x.UseJsonFile(Path.Combine(busConfig.FileSystemTransportBaseDirectory, "rebus_subscriptions.json"))) .Transport(x => x.UseAzureServiceBus(busConfig.AzureSBConnectionString, busConfig.MainQueue).AutomaticallyRenewPeekLock()); return config; }, onCreated: async bus => { await bus.Subscribe<CreateNewReportMessage>(); } ); services.AutoRegisterHandlersFromAssemblyOf<Program>(); }) .Build(); await host.RunAsync();
错误日志
INFO] [DBG] Rebus.AzureServiceBus.AzureServiceBusTransport (Thread #1): Registering subscription for topic "MyServiceBus/MyServiceBus.Messages.CreateNewReportMessage" INFO] Successfully created bus instance RebusBus Rebus 1 (isDefaultBus: True) INFO] Application started. Press Ctrl+C to shut down. INFO] fail: Microsoft.Extensions.Hosting.Internal.Host[9] INFO] BackgroundService failed INFO] ---> Azure.RequestFailedException: The specified HTTP verb (GET) is not valid. To know more visit https://aka.ms/sbResourceMgrExceptions. . TrackingId:1808 INFO] Status: 400 (Bad Request) INFO] --- End of inner exception stack trace --- INFO] at Azure.Messaging.ServiceBus.Administration.HttpRequestAndResponse.ThrowIfRequestFailedAsync(Request request, Response response) INFO] at Azure.Messaging.ServiceBus.Administration.HttpRequestAndResponse.SendHttpRequestAsync(Request request, CancellationToken cancellationToken) INFO] at Azure.Messaging.ServiceBus.Administration.HttpRequestAndResponse.GetEntityAsync(String entityPath, String query, Boolean enrich, CancellationToken can INFO] at Azure.Messaging.ServiceBus.Administration.ServiceBusAdministrationClient.TopicExistsAsync(String name, CancellationToken cancellationToken) INFO] at Rebus.AzureServiceBus.AzureServiceBusTransport.EnsureTopicExists(String normalizedTopic) INFO] at Rebus.AzureServiceBus.AzureServiceBusTransport.<>c__DisplayClass25_0.<RegisterSubscriber>b__0>d.MoveNext() INFO] --- End of stack trace from previous location --- INFO] at Rebus.Internals.ExceptionIgnorant.Execute(Func`1 function, CancellationToken cancellationToken) INFO] at Rebus.Internals.ExceptionIgnorant.Execute(Func`1 function, CancellationToken cancellationToken) INFO] at Rebus.AzureServiceBus.AzureServiceBusTransport.RegisterSubscriber(String topic, String subscriberAddress) INFO] at Rebus.Bus.RebusBus.InnerSubscribe(String topic)
解决方案
1. 检查连接字符串权限
错误提示HTTP动词GET无效,核心原因是当前使用的Azure ServiceBus连接字符串缺少管理权限。Rebus在订阅消息时需要检查/创建主题和订阅,这些操作需要使用拥有Manage权限的连接字符串(比如Azure门户中RootManageSharedAccessKey对应的连接字符串)。
2. 修正主题名称格式
日志中显示的主题名称MyServiceBus/MyServiceBus.Messages.CreateNewReportMessage包含/,这不符合Azure ServiceBus的命名规则(主题名称不能包含/、\等特殊字符)。可以通过以下方式修改:
在Rebus配置中添加Azure ServiceBus订阅存储,自动处理命名逻辑:
config.Subscriptions(s => s.UseAzureServiceBusSubscriptions());
3. 跳过自动创建主题/订阅(可选)
如果不想赋予连接字符串管理权限,可以提前在Azure门户手动创建对应的主题和订阅,然后在Rebus配置中禁用自动创建逻辑:
.Transport(x => x.UseAzureServiceBus(busConfig.AzureSBConnectionString, busConfig.MainQueue) .AutomaticallyRenewPeekLock() .DoNotCreateTopics() .DoNotCreateSubscriptions());
内容的提问来源于stack exchange,提问作者harry777
相关产品推荐
相关产品推荐

