Я хочу прочитать строку подключения, определенную в 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.
Сообщение об ошибке не такое точное, поэтому я его пропустил!
спасибо за помощь !
да, я думаю, мне следует
Можете ли вы предоставить свой csproj?
где мне это найти?
я сделал это! надеюсь, это сработает
Опубликовал ответ ниже @heyoka955.
В изолированной модели запуск не используется, вам нужно использовать 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?
То же самое, используйте local.settings.json вместо host.json в Program.cs, AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
нет, я имел в виду файл launchSettings.json, который находится в папке «Свойства»!
Введите launchsettings и отметьте вместо host.json в program.cs, а строка con будет сохранена в local.settings.json.
Тогда строка con становится нулевой, я думаю, что он не нашел файл запуска!
AFAIK, да, поскольку оно не является частью приложения Function, поэтому вы его не получите, и я никогда о нем не слышал..
хорошо, где я могу сохранить свои строки подключения в функции Azure для производства?
В настройках приложения (раздел «Переменная среды») приложения-функции на портале или вы можете развернуть функцию из локального хранилища и установить строку con в local.settings.json, она загрузится в настройки приложения в Porrtal.
но если я выберу вариант Apporach, как я могу получить доступ к переменной в моем коде, если переменная находится в Azure?
Это работает, вам следует проверить документы Microsoft, их так много, если у вас есть какие-либо сомнения, откройте новый вопрос, сообщество поможет.
это сработало, чем вы очень!
Вы используете изолированную модель?