#azure-functions #azureservicebus #nservicebus #.net-6.0
Вопрос:
Я использую NServiceBus с проектом функций Azure ( 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
код закомментирован при запуске функции, исключение не создается, и сообщения успешно обрабатываются. Но мне нужно иметь конфигурацию UseTransport
запуска для NServiceBus, чтобы автоматически настроить транспортную топологию. Пожалуйста, помогите мне решить эту проблему.
Комментарии:
1. Какую версию
Nuget Package: NServiceBus.Transport.AzureServiceBus
вы используете в проекте?2. @HariKrishnaRajoli-MT Использует последнюю стабильную версию v2.0.2
3. Какую
NServiceBus
версию вы используете?4. @ХариКришнарАджоли-MT 7.5
Ответ №1:
Если вы используете автобус NServiceBus.Азурефункции.В процессе.Пакет ServiceBus, тогда вам не следует звонить UseTransport<>()
.
Библиотека делает это за вас, но она также содержит некоторый дополнительный код для предотвращения запуска части транспорта, принимающей сообщения. Вместо этого конечная точка просто сидит и ждет, пока один из методов запуска функций Azure вызовет один из методов обработки конечных точек.
Если вы звоните UseTransport<>()
сами, то запускается стандартный приемник сообщений, и когда триггер функции Azure вызывает метод процесса, код перехвата не был настроен должным образом. Вот почему вы видите исключение нулевой ссылки.
Вы не должны полагаться на конечную точку NServiceBus для создания топологии в транспорте. Конечная точка создается только при запуске первой функции Azure. Обычно это происходит при поступлении сообщения, но это не может произойти до настройки топологии. Существует средство командной строки, которое помогает подготовить новую среду служебной шины Azure для использования с NServiceBus.
Ответ №2:
Поскольку вы используете стабильные версии для своего приложения, такие как:
Я бы предложил изменить синтаксис и попробовать на основе вариантов использования строки подключения:
Чтобы использовать служебную шину Azure в качестве базового транспорта:
Способ 1:
Если переменная строки подключения AzureServiceBusConnectionString
присутствует в файле веб-конфигурации, попробуйте вызвать строку подключения, используя приведенный ниже код:
var transport = endpointConfiguration.UseTransport<AzureServiceBusTransport>();
var connectionString = context.Configuration.GetConnectionString("AzureServiceBusConnectionString");
transport.ConnectionString(connectionString);
Способ 2: Прямое указание строки подключения
var transport = endpointConfiguration.UseTransport<AzureServiceBusTransport>(); transport.ConnectionString("Endpoint=sb://[NAMESPACE].servicebus.windows.net/;SharedAccessKeyName=[KEYNAME];SharedAccessKey=[KEY]");
Для получения более подробной информации о том, как извлечь строку подключения из web config с помощью configuration manager в контекст приложения (способ 1), пожалуйста, ознакомьтесь с этой документацией Microsoft.