我正在尝试实现 Azure 服务总线连接字符串验证,如这篇文章中所示,但我随后尝试将服务总线客户端作为单例添加到服务集合中,引发了一个无效的操作异常,内容为“服务集合无法修改,因为它是只读的。”这是我的代码目前的样子:
// Validate the configuration:
await using var testClient = new ServiceBusClient(config.ServiceBusConnectionString);
await using var testSender = testClient.CreateSender(config.QueueName);
using var batch = await testSender.CreateMessageBatchAsync().ConfigureAwait(false);
// Add Azure Service Bus client:
services.AddSingleton(provider =>
{
var client = new ServiceBusClient(
config.ServiceBusConnectionString,
new ServiceBusClientOptions
{
TransportType = ServiceBusTransportType.AmqpWebSockets
});
return client;
});
正如我引用的帖子中那样,我的目标只是确保配置的连接字符串和队列名称格式正确,并且代码能够建立连接。有没有办法可以避免我看到的错误?
编辑
堆栈跟踪,根据要求:
at Microsoft.Extensions.DependencyInjection.ServiceCollection.ThrowReadOnlyException()
at Microsoft.Extensions.DependencyInjection.ServiceCollection.System.Collections.Generic.ICollection<Microsoft.Extensions.DependencyInjection.ServiceDescriptor>.Add(ServiceDescriptor item)
at Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(IServiceCollection services, Type serviceType, Func`2 implementationFactory)
at Services.Audit.AuditServiceExtension.<AddAuditService>d__0.MoveNext() in C:\Users\Dumas.DED\Projects\Services.Audit\AuditServiceExtension.cs:line 36
at Services.Audit.AuditServiceExtension.<AddAuditService>d__0.MoveNext() in C:\Users\Dumas.DED\Projects\Services.Audit\AuditServiceExtension.cs:line 63
at Services.Audit.AuditServiceExtension.<AddAuditService>d__0.MoveNext() in C:\Users\Dumas.DED\Projects\Services.Audit\AuditServiceExtension.cs:line 63
确保您在服务总线代码中使用的
connectionstring
已分配 correct Send, Listen Permissions
。我正在使用 Root Connection String 以及我的代码中的所有权限:-
使用
Shared Access key
的 Service Bus Namespace
。还有not Service Bus queue
。
我的代码与
DI
并使 ServiceBusClient
单例:-
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Azure.Messaging.ServiceBus;
class Program
{
static async Task Main()
{
await RunAsync();
}
static async Task RunAsync()
{
// Setup dependency injection
var serviceProvider = await ConfigureServicesAsync();
// Get the ServiceBusClient from the service provider
var serviceBusClient = serviceProvider.GetRequiredService<ServiceBusClient>();
// Use the serviceBusClient as needed...
// For example, creating a sender and sending a message
await using var sender = serviceBusClient.CreateSender("myqueue");
var message = new ServiceBusMessage("Hello, Service Bus!");
await sender.SendMessageAsync(message);
// The serviceBusClient doesn't need to be explicitly disposed, as it's managed by the DI container.
// Ensure that the application does not exit immediately
Console.ReadLine();
}
static async Task<IServiceProvider> ConfigureServicesAsync()
{
var services = new ServiceCollection();
// Your configuration goes here (replace with actual connection string)
var config = new { ServiceBusConnectionString = "Endpoint=sb://siliconsb67.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=xxxxxx0TNmIcv+ASbDiecrE=" };
// Validate the configuration:
await using var testClient = new ServiceBusClient(config.ServiceBusConnectionString);
await using var testSender = testClient.CreateSender("myqueue");
// Add Azure Service Bus client:
var serviceBusClient = new ServiceBusClient(
config.ServiceBusConnectionString,
new ServiceBusClientOptions
{
TransportType = ServiceBusTransportType.AmqpWebSockets
});
services.AddSingleton(serviceBusClient);
// Build the service provider
return services.BuildServiceProvider();
}
}
输出:-