Почему моя функция Azure не может прочитать переменную среды, определенную в классе запуска?

Я хочу прочитать строку подключения, определенную в host.json в моем классе запуска. Проблема в том, что при запуске IConfiguration всегда имеет значение null!

<Project Sdk = "Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <AzureFunctionsVersion>v4</AzureFunctionsVersion>
    <OutputType>Exe</OutputType>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
  <ItemGroup>
    <FrameworkReference Include = "Microsoft.AspNetCore.App" />
    <PackageReference Include = "Azure.Storage.Queues" Version = "12.18.0" />
    <PackageReference Include = "Microsoft.Azure.Functions.Extensions" Version = "1.1.0" />
    <PackageReference Include = "Microsoft.Azure.Functions.Worker" Version = "1.20.1" />
    <PackageReference Include = "Microsoft.Azure.Functions.Worker.Extensions.Http" Version = "3.1.0" />
    <PackageReference Include = "Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore" Version = "1.2.0" />
    <PackageReference Include = "Microsoft.Azure.Functions.Worker.Sdk" Version = "1.16.4" />
    <PackageReference Include = "Microsoft.ApplicationInsights.WorkerService" Version = "2.22.0" />
    <PackageReference Include = "Microsoft.Azure.Functions.Worker.ApplicationInsights" Version = "1.1.0" />
    <PackageReference Include = "Microsoft.Extensions.DependencyInjection" Version = "8.0.0" />
    <PackageReference Include = "Newtonsoft.Json" Version = "13.0.3" />
  </ItemGroup>
  <ItemGroup>
    <None Update = "host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update = "local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
    <None Update = "Properties\launchSettings.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>
  <ItemGroup>
    <Using Include = "System.Threading.ExecutionContext" Alias = "ExecutionContext" />
  </ItemGroup>
  <ItemGroup>
    <Compile Update = "Startup.cs">
      <CopyToOutputDirectory>Never</CopyToOutputDirectory>
    </Compile>
  </ItemGroup>
</Project>

Это Function1.csproj

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

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

namespace MyNamespace
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            var configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("host.json", optional: true, reloadOnChange: true)
                .AddEnvironmentVariables().Build();

            IConfiguration conf = configuration;

            builder.Services.AddSingleton(conf);
            builder.Services.AddHttpClient();
        }
    }
}

Это класс запуска, который я определил для внедрения зависимостей IConfiguration!

using FirstFunction.dto;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System.Globalization;
using System.Text;
using Azure.Storage.Queues;
using Azure.Storage.Queues.Models;
using Microsoft.Extensions.Configuration;
using System.Reflection;

namespace FirstFunction
{
    public class Function1
    {
        private readonly ILogger<Function1> _logger;
        private readonly IConfiguration _configuration;
        private readonly HttpClient _httpClient;

        public Function1(ILogger<Function1> logger)
        {
            _logger = logger;
        }

        public Function1(ILogger<Function1> logger, IConfiguration configuration, HttpClient httpClient) : this(logger)
        {
            _configuration = configuration;
            _httpClient = httpClient;
        }

        [Function("Function1")]
        public async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req)
        {
            #region Catch Error
            string requestBody = string.Empty;
            try
            {
                requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            }
            catch (Exception ex)
            {
                _logger.LogError($"Error reading request body: {ex.Message}");
                return new StatusCodeResult(StatusCodes.Status500InternalServerError);
            }
            #endregion

            string myConnectionString = _configuration["ConnectionStrings:QUEUE_CONNECTION_STRING"];

 return new  OkObjectResult("Data was sent to backend");
        }
    }
}

Это мой метод Azure Function. Код сокращен


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

var host = new HostBuilder()
    .ConfigureFunctionsWebApplication()
    .ConfigureServices(services =>
    {
        services.AddApplicationInsightsTelemetryWorkerService();
        services.ConfigureFunctionsApplicationInsights();
    })
    .Build();

host.Run();



Это было создано под названием Programm.cs.

Сообщение об ошибке не такое точное, поэтому я его пропустил!

спасибо за помощь !

Вы используете изолированную модель?

RithwikBojja 08.07.2024 11:10

да, я думаю, мне следует

heyoka955 08.07.2024 11:12

Можете ли вы предоставить свой csproj?

RithwikBojja 08.07.2024 11:12

где мне это найти?

heyoka955 08.07.2024 11:14
i.imgur.com/PyNVvVt.png дважды щелкните приложение «Название функции», и вы получите его.
RithwikBojja 08.07.2024 11:15

я сделал это! надеюсь, это сработает

heyoka955 08.07.2024 11:21

Опубликовал ответ ниже @heyoka955.

RithwikBojja 08.07.2024 11:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В изолированной модели запуск не используется, вам нужно использовать Program.cs, а чтобы получить значение от host.json, используйте код ниже, и я следовал SO-Thread:

Программа.cs:

using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

var host = new HostBuilder()
    .ConfigureFunctionsWebApplication()
    .ConfigureServices(services =>
    {
        services.AddApplicationInsightsTelemetryWorkerService();
        services.ConfigureFunctionsApplicationInsights();
    })
    .ConfigureAppConfiguration((context, test) =>
    {
        test.SetBasePath(context.HostingEnvironment.ContentRootPath)
          .AddJsonFile("host.json", optional: true, reloadOnChange: true)
          .AddEnvironmentVariables();
    })
    .Build();

host.Run();

Функция1.cs:

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;

namespace FunctionApp200
{
    public class Function1
    {
        private readonly ILogger<Function1> _logger;
        private readonly IConfiguration ri_con;
        public Function1(ILogger<Function1> logger, IConfiguration config)
        {
            _logger = logger;
            ri_con = config;
        }a

        [Function("Function1")]
        public IActionResult Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequest req)
        {
            _logger.LogInformation("C# HTTP trigger function processed a request.");
            var rith = ri_con["Value"];
            Console.WriteLine(rith);
            return new OkObjectResult($"Hello Rithwik, value is {rith}");
        }
    }
}

хост.json:

{
    "version": "2.0",
  "logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,
        "excludedTypes": "Request"
      },
      "enableLiveMetricsFilters": true
    }
  },
  "Value": "Rithwik"
}

Выход:

Кажется, это работает, но как я могу получить доступ к переменным из launchSettings.json вместо host.json?

heyoka955 08.07.2024 11:34

То же самое, используйте local.settings.json вместо host.json в Program.cs, AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)

RithwikBojja 08.07.2024 11:37

нет, я имел в виду файл launchSettings.json, который находится в папке «Свойства»!

heyoka955 08.07.2024 11:39

Введите launchsettings и отметьте вместо host.json в program.cs, а строка con будет сохранена в local.settings.json.

RithwikBojja 08.07.2024 11:40

Тогда строка con становится нулевой, я думаю, что он не нашел файл запуска!

heyoka955 08.07.2024 11:45

AFAIK, да, поскольку оно не является частью приложения Function, поэтому вы его не получите, и я никогда о нем не слышал..

RithwikBojja 08.07.2024 11:46

хорошо, где я могу сохранить свои строки подключения в функции Azure для производства?

heyoka955 08.07.2024 11:52

В настройках приложения (раздел «Переменная среды») приложения-функции на портале или вы можете развернуть функцию из локального хранилища и установить строку con в local.settings.json, она загрузится в настройки приложения в Porrtal.

RithwikBojja 08.07.2024 11:53

но если я выберу вариант Apporach, как я могу получить доступ к переменной в моем коде, если переменная находится в Azure?

heyoka955 08.07.2024 11:59

Это работает, вам следует проверить документы Microsoft, их так много, если у вас есть какие-либо сомнения, откройте новый вопрос, сообщество поможет.

RithwikBojja 08.07.2024 12:04

это сработало, чем вы очень!

heyoka955 09.07.2024 08:42

Другие вопросы по теме