将 NamespaceManager 用于 Azure 服务总线时出现 ConfigurationManager 错误

Getting ConfigurationManager error when using NamespaceManager for Azure Service Bus

我有一个简单的 class,我想用它在我的 Azure 服务总线命名空间上创建一个队列。这是我的 class:

public class ServiceBusPublisher
{
    private readonly string _connString;        

    public ServiceBusPublisher(IConfiguration config)
    {
        _connString = config.GetSection("ServiceBus:Endpoint").Value;
    }

    public void CreateQueue(string queueName)
    {
        var namespaceManager = NamespaceManager.CreateFromConnectionString(_connString);

        if (!namespaceManager.QueueExists(queueName))
        {
            namespaceManager.CreateQueue(queueName);
        }            
    }
}

一切都已设置并且似乎正常工作,我在我的启动中注册了该服务,并且我的连接字符串正常运行,作为服务总线连接字符串:

Endpoint=sb://myservicebus.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=abcdefg12345

但是当它尝试调用 NamespaceManager.CreateFromConnectionString(_connString) 时,我得到了这个异常

System.IO.FileNotFoundException: Could not load file or assembly 'System.Configuration.ConfigurationManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. The system cannot find the file specified. File name: 'System.Configuration.ConfigurationManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' at Microsoft.ServiceBus.Messaging.Configuration.KeyValueConfigurationManager.CreateNameValueCollectionFromConnectionString(String connectionString) at Microsoft.ServiceBus.Messaging.Configuration.KeyValueConfigurationManager.Initialize(String connection, Nullable`1 transportType) at Microsoft.ServiceBus.NamespaceManager.CreateFromConnectionString(String connectionString)

我觉得我疯了,因为这应该很简单,但它似乎正在尝试访问配置文件,但它不能。但我已经将连接字符串传递给它,所以我不确定为什么要这样做。

我是不是做错了什么?

我假设您正在使用 WindowsAzure.ServiceBus 库。它与.net core平台不兼容。

Please note that this package requires .Net Framework 4.5.2 Full Profile.

如果你想在.net core平台创建队列。我建议您最好使用 Management library 或等到 NamespaceManager 的替换包出来。

目前更换包未发出,详情可参考此. For more details about how to use the Management Library, you could refer to another SO thread

以下是管理库的演示代码。

var credentials = SdkContext.AzureCredentialsFactory.FromFile(@"auth file path");
var azure = Azure
           .Configure()
           .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic)
           .Authenticate(credentials)
           .WithDefaultSubscription();
var sbNameSpace = "service bus namespace";
var resoureGroup = "resource group";
var servicebus = azure.ServiceBusNamespaces.GetByResourceGroup(resoureGroup, sbNameSpace);
var queue = servicebus.Queues.Define("queuename").Create()

ManagementClient 现在可用作 Microsoft.Azure.ServiceBus v5.2.0 的替代品,请参阅:

https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.servicebus.management.managementclient?view=azure-dotnet

CreateQueue方法:

https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.servicebus.management.managementclient.createqueueasync?view=azure-dotnet