Служба разрешения для IHttpClientFactory не работает на Azure Функция - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь внедрить IHttpClientFactory службу в Azure Функция v3, но я получаю следующее сообщение об ошибке: «Не удалось разрешить службу». Я использую azure-functions-core-tools@v3 для локального запуска Azure.

[2/14/2020 5:45:19 PM] Executed 'Foo' (Failed, Id=24489b3b-af99-417e-b175-443b76c241d5)
[2/14/2020 5:45:19 PM] Microsoft.Extensions.DependencyInjection.Abstractions: Unable to resolve service for type 'System.Net.Http.IHttpClientFactory' while attempting to activate 'MyFunction.Function.Foo'.

У меня есть класс запуска, который должен внедрить службу для IHttpClientFactory.

using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;

namespace MyFunction
{
    public class Startup : FunctionsStartup
    {

        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddHttpClient();
        }
    }
}

и ниже. это класс функций azure, который использует внедренный сервис IHttpClientFactory для создания HTTP-клиента и отправки запроса GET на сервер.

using System.Threading.Tasks;
using System.Net.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;

namespace MyFunction.Function
{
    public class Foo
    {
        private readonly HttpClient httpClient;
        public Scrape(IHttpClientFactory httpClientFactory)
        {
            httpClient = httpClientFactory.CreateClient();
        }

        [FunctionName("Foo")]
        public async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            var result = await httpClient.GetAsync("https://google.com");
            var data = await result.Content.ReadAsStringAsync();
            return new OkObjectResult(data);
        }
    }
}

Я что-то упустил?

1 Ответ

1 голос
/ 14 февраля 2020

Похоже, в вашем startup.cs классе отсутствует ссылка на сборку?

[assembly: FunctionsStartup(typeof(MyFunction.Startup))]

Попробуйте добавить это в класс запуска. Добавьте его сразу после ваших using операторов вверху и перед любым объявлением пространства имен.

Кроме того, большинство примеров, которые я видел, показывают, что клиент фактически создан во время выполнения функции, а не в конструкторе по умолчанию.

using System.Threading.Tasks;
using System.Net.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;

namespace MyFunction.Function
{
    public class Foo
    {
        private readonly HttpClient httpClient;
        public Scrape(IHttpClientFactory httpClientFactory)
        {
            factory = httpClientFactory;
        }

        [FunctionName("Foo")]
        public async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            HttpClient httpClient = factory.CreateClient();
            var result = await httpClient.GetAsync("https://google.com");
            var data = await result.Content.ReadAsStringAsync();
            return new OkObjectResult(data);
        }
    }
}
...