У меня есть консольное приложение. net, которое я собираюсь развернуть как веб-задание Azure. Цель задания - прослушивать новые сообщения в Azure очереди служебной шины. Я настроил слушателя с помощью функции, содержащей атрибут [ServiceBusTrigger]. Я построил фиктивную реализацию, которая просто читает последнее сообщение из очереди - это работает без проблем - сообщение корректно передается из очереди служебной шины в мою функцию.
Когда я пытаюсь go перейти к следующему Уровень и добавить параметр интерфейса для функции, которая будет введена DI Я получаю ошибку.
Microsoft. Azure .WebJobs.Host.Indexers.FunctionIndexingException: 'Метод индексации ошибок' Functions.ProcessMeasurementData '' InvalidOperationException: Невозможно привязать параметр 'service' к типу IProcessMeasurementService. Убедитесь, что параметр Type поддерживается привязкой. Если вы используете расширения привязки (например, Azure Storage, ServiceBus, Timers и т. Д. c.), Убедитесь, что вы вызвали метод регистрации для расширения (ей) в своем коде запуска (например, builder.AddAzureStorage () , builder.AddServiceBus (), builder.AddTimers (), et c.).
Это моя функция. Если я удалю параметр IProcessMeasurementService service, он без проблем будет работать локально из Visual Studio 2019 (я еще не пробовал развертывать на azure в качестве веб-задания), подбирая новые элементы по мере их добавления на служебную шину Azure. Очередь.
public class Functions
{
public static async Task ProcessMeasurementData(
[ServiceBusTrigger("process-measurement-data-queue", Connection = "AzureWebJobsServiceBus")] Message message,
IProcessMeasurementService service)
{
try
{
var measurements = JsonConvert
.DeserializeObject<List<CreateMeasurementInput>>
(Encoding.UTF8.GetString(message.Body));
await service.DoStuff(measurements);
// log.LogInformation(message.ContentType);
}
catch (Exception e)
{
throw;
}
}
Мне кажется, я правильно регистрирую службу, например:
{
// Register application services
services.AddSingleton<IProcessMeasurementService, ProcessMeasurementService>();
});
Это моя основная функция в целом.
static void Main(string[] args)
{
var builder = new HostBuilder();
builder.ConfigureAppConfiguration((builder) =>
{
builder
.AddJsonFile("appsettings.json", false, true)
.AddEnvironmentVariables();
});
builder.ConfigureWebJobs(b =>
{
b.AddServiceBus(x =>
{
x.MessageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler)
{
AutoComplete = false
};
});
b.AddAzureStorageCoreServices();
});
builder.ConfigureServices(services =>
{
services.AddOptions();
// Register application services
services.AddSingleton<IProcessMeasurementService, ProcessMeasurementService>();
});
var host = builder.Build();
using (host)
{
host.Run();
}
}
От поисков в Google кажется, что проблема может быть связана с моей версией пакета nuget. Я попытался добавить файл с именем "host. json" на случай, если это была известная проблема с версиями функций azure, конфликтующими с библиотеками расширений. Но это ничего не сделало. На самом деле я не использую AzureFunctions (я имею в виду функции без сервера), но на этом этапе я держусь за str aws.
Кто-нибудь знает, в чем проблема?
Это хост. json на всякий случай, если это проблема.
{
"version": "2.0",
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[1.*, 2.0.0)"
}
}
Вот мой нюгет установленные версии
<PackageReference Include="Microsoft.Azure.ServiceBus" Version="4.1.2" />
<PackageReference Include="Microsoft.Azure.WebJobs" Version="3.0.16" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.ServiceBus" Version="4.1.1" />
<PackageReference Include="Microsoft.Azure.WebJobs.Sources" Version="3.0.16" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="2.2.0" />