Добавление Microsoft.Azure.WebJobs.Расширения.Пакет SignalRService в Azure Function project прерывает внедрение зависимостей

#azure-functions #azure-signalr

#azure-функции #azure-signalr

Вопрос:

В настоящее время я работаю над веб-приложением, где у меня есть серверная часть API функций Azure, которая взаимодействует с базой данных Azure Cosmos. Я добавил внедрение зависимостей в мой проект, как описано в этой статье: https://learn.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection

Мой класс запуска выглядит следующим образом:

 using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using PoolScoreTrackerV2.API.Config;
using PoolScoreTrackerV2.Functions.Services;
using System;

[assembly: FunctionsStartup(typeof(PoolScoreTrackerV2.Functions.Startup))]

namespace PoolScoreTrackerV2.Functions
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddLogging(loggingBuilder =>
            {
                loggingBuilder.AddFilter(level => true);
            });

            builder.Services.AddOptions<CosmosDbOptions>()
                .Configure<IConfiguration>((settings, configuration) =>
                {
                    configuration.GetSection("CosmosDb").Bind(settings);
                });

            builder.Services.AddSingleton<ICosmosDbService>(
                new CosmosDbService(
                    new CosmosClient(
                        Environment.GetEnvironmentVariable("CosmosDb:CosmosDbConnection")
                        )
                    )
                );
        }
    }
}
  

И вот пример того, как я использую его в своих функциях:

 namespace PoolScoreTrackerV2.API.Functions.Matches
{
    public class GetMatches
    {
        private readonly ICosmosDbService _cosmosDbService;
        private readonly ILogger<GetMatches> _logger;
        private readonly CosmosDbOptions _settings;

        public GetMatches(ICosmosDbService cosmosDbService, ILogger<GetMatches> logger, IOptions<CosmosDbOptions> settings)
        {
            _cosmosDbService = cosmosDbService;
            _logger = logger;
            _settings = settings.Value;
            _cosmosDbService.InitializeCollection(_settings.DatabaseId, _settings.ContainerId);
        }

        [FunctionName("GetMatches")]
        public async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "matches")] HttpRequest req, ClaimsPrincipal principal)
        {
            if (ValidationExtensions.AuthorizeUser(principal) == false)
            {
                return new UnauthorizedResult();
            }

            var data = await _cosmosDbService.GetAsync<Match>("SELECT * FROM m where m.type = 'match'");

            _logger.LogInformation("GET Matches");

            return new OkObjectResult(data);
        }
    }
}
  

Все работало, как ожидалось, пока мне не понадобилось добавить SignalR для одной конкретной страницы, для которой требуются текущие данные. После простой установки пакета SignalR Microsoft.Azure.WebJobs.Расширения.SignalRService, я заметил эту ошибку в консоли:

 [2020-10-14T07:05:00.381] Unsupported service transport type: . Use default Transient instead.
  

Когда я пытаюсь получить доступ к конечным точкам API, я получаю ошибку 500 на всех конечных точках и следующую ошибку в консоли:

 Executed 'GetMatches' (Failed, Id=3a10737c-7abe-4e18-aeb6-1d442b36ef7a, Duration=43ms)
[2020-10-14T07:05:08.289] Microsoft.Extensions.DependencyInjection.Abstractions: Unable to resolve service for type 'PoolScoreTrackerV2.Functions.Services.ICosmosDbService' while attempting to activate 'PoolScoreTrackerV2.API.Functions.Matches.GetMatches'.
  

Я обновил все свои пакеты до последних версий и попытался переустановить все пакеты, но я все еще получаю ту же ошибку. Когда я удаляю пакет SignalR, все ошибки исчезают. Я тестировал это несколько раз.

Ответ №1:

Изменение версии на 1.0.2 устранило ошибку внедрения зависимостей. Я по-прежнему получаю предупреждение о неподдерживаемом типе транспорта службы, но теперь я могу запрашивать данные без исключений.