NServiceBus UseTransport 在升级到 .NET 6 后不起作用

Posted

技术标签:

【中文标题】NServiceBus UseTransport 在升级到 .NET 6 后不起作用【英文标题】:NServiceBus UseTransport not working after upgrading to .NET 6 【发布时间】:2021-11-30 07:49:01 【问题描述】:

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

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

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

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

【问题讨论】:

你在项目中使用的Nuget Package: NServiceBus.Transport.AzureServiceBus是什么版本? @HariKrishnaRajoli-MT 使用最新稳定版本v2.0.2 您使用的NServiceBus 版本是什么? @HariKrishnaRajoli-MT 7.5 【参考方案1】:

如果您使用的是 NServiceBus.AzureFunctions.InProcess.ServiceBus 包,则不应调用 UseTransport&lt;&gt;()

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

如果你自己调用UseTransport&lt;&gt;(),则启动标准消息接收器,当Azure函数触发器调用Process方法时,拦截代码没有正确配置。这就是您看到空引用异常的原因。

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

【讨论】:

【参考方案2】:

当您为您的应用程序使用稳定版本时,例如:

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

使用 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 config 获取连接字符串到应用程序上下文的更多详细信息(方法 1),请查看此Microsoft documentation。

【讨论】:

以上是关于NServiceBus UseTransport 在升级到 .NET 6 后不起作用的主要内容,如果未能解决你的问题,请参考以下文章

插入后nservicebus删除订阅记录?

NServiceBus 与 Windows ServiceBus

不在 NServiceBus 中自动创建队列

使用 WiX 将 NServiceBus.Host 安装为服务

使用NServiceBus开发分布式应用

NServiceBus SAGA 消息状态驱动