升级到 .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 一起使用。
我在 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 一起使用。