使用 Startup 类的 .Net 5 Azure Function App

Md *_*lam 13 configuration .net-core azure-functions .net-5

我创建了一个基于 HTTP 触发器的 .Net 5 Azure FunctionApp 并尝试为我的服务类配置数据库连接字符串和依赖项注入,但是我不知道如何从 Program.cs 调用 Startup.cs 文件的配置方法主功能。我是基于 FunctionApp 的托管新手。

我在 Program.cs 文件中尝试过使用 IHostBuilder,如下所示,但它说:“不包含ConfigureWebHostDefaults 的定义”甚至使用了命名空间 => using Microsoft.AspNetCore.Hosting;

public static void Main(string[] args)
{
    var host = new HostBuilder().ConfigureFunctionsWorkerDefaults()            
            .Build();

    //CreateHostBuilder(args).Build().Run();
    host.Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
   webBuilder.UseStartup<Startup>();
});
Run Code Online (Sandbox Code Playgroud)

我的 Startup.cs 文件,

[assembly: FunctionsStartup(typeof(Startup))]
namespace kpi
{
  public class Startup : FunctionsStartup
  {
    private static IConfiguration _configuration = null;        

    public override void Configure(IFunctionsHostBuilder builder)
    {
        var serviceProvider = builder.Services.BuildServiceProvider();
        _configuration = serviceProvider.GetRequiredService<IConfiguration>();
        var appSettingsSection = _configuration.GetSection("AppSetting");
        builder.Services.Configure<AppSetting>(appSettingsSection);
        var appSettings = appSettingsSection.Get<AppSetting>();
        RuntimeConfig.appsettings = appSettings;

        var ConnectionString = RuntimeConfig.appsettings.AppDBConnection;
        builder.Services.AddDbContext<ShardingDbContext>(options => 
       options.UseSqlServer(ConnectionString), ServiceLifetime.Transient);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我已经使用了 FunctionStartup 程序集,我不知道哪里出了问题,任何人都可以帮助我从 Startup.cs 文件配置我的连接字符串吗?

Mét*_*ule 36

Azure 函数有两种风格,两者之间的依赖项注入配置不同。来自文档

以前,Azure Functions 仅支持 .NET 函数的紧密集成模式,该模式作为类库在与主机相同的进程中运行。这种模式提供了主机进程和功能之间的深度集成。例如,.NET 类库函数可以共享绑定 API 和类型。然而,这种集成还需要主机进程和.NET 功能之间更紧密的耦合。例如,进程内运行的 .NET 函数需要在与 Functions 运行时相同的 .NET 版本上运行。为了使您能够在这些限制之外运行,您现在可以选择在隔离的进程中运行。这种进程隔离还允许您开发使用当前 .NET 版本(例如 .NET 5.0)的函数,而 Functions 运行时本身不支持这些函数。

这两种模式之间存在很多差异,因此请务必检查它们以选择符合您要求的模式。

进程内 Azure 函数

通过此配置,您的 Azure 函数与主机运行时紧密耦合。在撰写本文时,这意味着您的 Azure 函数无法在 .NET5 上运行。

您将需要以下 NuGet 包:

  • Microsoft.Azure.Functions.Extensions
  • Microsoft.NET.Sdk.Functions版本 1.0.28 或更高版本
  • Microsoft.Extensions.DependencyInjection

FunctionsStartup属性与类一起使用Startup

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

[assembly: FunctionsStartup(typeof(MyNamespace.Startup))]
namespace MyNamespace
{
  public class Startup : FunctionsStartup
  {
    public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
    {
        var context = builder.GetContext();

        // optional: customize your configuration sources 
        // here, we add appsettings.json files 
        // Note that these files are not automatically copied on build or publish. 
        builder.ConfigurationBuilder
            .AddJsonFile(Path.Combine(context.ApplicationRootPath, "appsettings.json"), optional: true, reloadOnChange: false)
            .AddJsonFile(Path.Combine(context.ApplicationRootPath, $"appsettings.{context.EnvironmentName}.json"), optional: true, reloadOnChange: false);
    }
    
    public override void Configure(IFunctionsHostBuilder builder)
    {
        // get the configuration from the builder
        var configuration = builder.GetContext().Configuration;
    }
}
Run Code Online (Sandbox Code Playgroud)

请在此处查看更多信息:https ://learn.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection

隔离进程 Azure 函数

在此模式下,Azure 函数与主机运行时完全解耦(这与允许使用 C# 以外的语言编写 Azure 函数的模式相同)。您负责创建主机。

您将需要以下 NuGet 包:

  • Microsoft.Azure.Functions.Worker
  • Microsoft.Azure.Functions.Worker.Sdk
  • Microsoft.Azure.Functions.Worker.Extensions

这里没有Startup班级;您负责自己创建主机Program.cs

using Microsoft.Extensions.Hosting;

public static async Task Main(string[] args)
{  
  var builder = Host
    .CreateDefaultBuilder(args)
    .ConfigureFunctionsWorkerDefaults()
    .ConfigureAppConfiguration((hostingContext, configBuilder) =>
    {
        // optional: customize your configuration sources 
        // here, we add appsettings.json files 
        // Note that these files are not automatically copied on build or publish. 
        var env = hostingContext.HostingEnvironment;
        configBuilder
          .AddJsonFile($"appsettings.json", optional: true, reloadOnChange: true)
          .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
          ;
    })
    .ConfigureServices((appBuilder, services) =>
    {
        var configuration = appBuilder.Configuration;
    });

    await builder.Build().RunAsync();
}
Run Code Online (Sandbox Code Playgroud)

请在此处查看更多信息:https ://learn.microsoft.com/en-us/azure/azure-functions/dotnet-isolated-process-guide

appsettings.json文件复制到输出目录

默认情况下,Azure 函数不识别appsettings.json文件。您需要通过将它们添加到应用程序配置中ConfigureAppConfiguration,但还需要将它们复制到输出目录,否则函数应用程序将无法找到它们。

为此,请将以下行添加到您的.csproj

<ItemGroup>
  <None Include="appsettings.json">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
  
  <None Include="appsettings.*.json"> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    <DependentUpon>appsettings.json</DependentUpon>
  </None>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)