升级到 .NET 6 后 NServiceBus UseTransport 不工作

NServiceBus UseTransport not working after upgrading to .NET 6

我在 Azure Function 项目中使用 NserviceBus (NServiceBus.AzureFunctions.InProcess.ServiceBus)。应用程序使用 azure 服务总线作为传输,并使用以下代码在函数启动时配置它

 var transport = configuration.AdvancedConfiguration.UseTransport<AzureServiceBusTransport>();
            transport.ConnectionString(@"AzureWebJobsServiceBus".GetConfig());

.NET Core 3.1 和 Azure 函数版本 3.0 一切正常。最近我将项目升级到.NET 6,函数版本升级到4.0。升级后,functionEndpoint.Process 抛出空引用异常。

如果UseTransport代码在函数启动时被注释掉,则不会抛出异常,并且消息被成功处理。但是我需要在 NServiceBus 的启动配置中有 UseTransport 来自动设置传输拓扑。请帮我解决这个问题。

因为您正在为您的应用程序使用稳定版本,例如:

我建议更改语法并尝试基于连接字符串用例:

要使用 Azure 服务总线作为基础传输: 方法一:

如果您的连接字符串变量 AzureServiceBusConnectionString 存在于 Web 配置文件中,请尝试使用以下代码调用连接字符串:

var transport = endpointConfiguration.UseTransport<AzureServiceBusTransport>();
var connectionString = context.Configuration.GetConnectionString("AzureServiceBusConnectionString"); 
transport.ConnectionString(connectionString);

方法二:直接给连接字符串

var transport = endpointConfiguration.UseTransport<AzureServiceBusTransport>(); transport.ConnectionString("Endpoint=sb://[NAMESPACE].servicebus.windows.net/;SharedAccessKeyName=[KEYNAME];SharedAccessKey=[KEY]");

有关使用配置管理器从 Web 配置获取连接字符串到应用程序上下文(方法 1)的更多详细信息,请查看此 Microsoft documentation

如果您使用的是 NServiceBus.AzureFunctions.InProcess.ServiceBus 包,那么您不应该调用 UseTransport<>()

该库会为您完成此操作,但它还包含一些附加代码以防止传输的消息接收器部分启动。相反,端点只是等待 Azure Function Trigger 方法之一调用端点 Process 方法之一。

如果您自己调用UseTransport<>(),则标准消息接收器会启动,当 Azure Function Trigger 调用 Process 方法时,拦截代码未正确配置。这就是您看到空引用异常的原因。

您不应依赖 NServiceBus 终结点在传输中创建拓扑。端点仅在触发第一个 Azure 函数时创建。通常这会在消息到达时发生,但在设置拓扑之前不会发生。提供了一个 command-line tool 来帮助配置新的 Azure 服务总线环境以与 NServiceBus 一起使用。