using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;
using System.Net.Http;
using System.Threading.Tasks;
namespace MyNamespace;
public class MyHttpTrigger
private readonly HttpClient _client;
private readonly IMyService _service;
public MyHttpTrigger(IHttpClientFactory httpClientFactory, IMyService service)
this._client = httpClientFactory.CreateClient();
this._service = service;
[FunctionName("MyHttpTrigger")]
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
ILogger log)
var response = await _client.GetAsync("https://microsoft.com");
var message = _service.GetMessage();
return new OkObjectResult("Response from function with injected dependencies.");
此示例使用在启动时注册 HttpClient
所需的 Microsoft.Extensions.Http 包。
服务生存期
Azure Functions 应用提供与 ASP.NET 依赖项注入相同的服务生存期。 就 Functions 应用来说,不同的服务生存期表现如下:
暂时性:每次解析此服务时,都会创建暂时性服务。
限定范围:限定范围的服务的生存期与函数执行生存期相匹配。 每次执行函数后,都会创建设有范围的服务。 在执行期间对该服务的后续请求会重复使用现有服务实例。
单一实例:单一实例服务生存期与主机生存期相匹配,并且在该实例上的各个函数执行之间重用。 对于连接和客户端(例如 DocumentClient
或 HttpClient
实例),建议使用单一实例生存期服务。
在 GitHub 上查看或下载不同服务生存期的示例。
日志记录服务
如果需要自己的日志记录提供程序,请将自定义类型注册为 ILoggerProvider
(可通过 Microsoft.Extensions.Logging.Abstractions NuGet 包获取)的实例。
Azure Functions 会自动添加 Application Insights。
请勿将 AddApplicationInsightsTelemetry()
添加到服务集合,因为它注册的服务与环境提供的服务发生冲突。
如果使用内置 Application Insights 功能,请勿注册自己的 TelemetryConfiguration
或 TelemetryClient
。 如果需要配置自己的 TelemetryClient
实例,请通过插入的 TelemetryConfiguration
创建一个实例,如在 C# 函数中记录自定义遥测中所示。
ILogger<T> 和 ILoggerFactory
主机会将 ILogger<T>
和 ILoggerFactory
服务注入构造函数中。 但是在默认情况下,会从函数日志中筛选出新日志记录筛选器。 需要修改 host.json
文件,以选择加入其他筛选器和类别。
下面的示例演示如何添加包含向主机公开的日志的 ILogger<HttpTrigger>
。
namespace MyNamespace;
public class HttpTrigger
private readonly ILogger<HttpTrigger> _log;
public HttpTrigger(ILogger<HttpTrigger> log)
_log = log;
[FunctionName("HttpTrigger")]
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req)
_log.LogInformation("C# HTTP trigger function processed a request.");
// ...
下面的示例 host.json
文件添加日志筛选器。
"version": "2.0",
"logging": {
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"excludedTypes": "Request"
"logLevel": {
"MyNamespace.HttpTrigger": "Information"
若要详细了解日志级别,请参阅配置日志级别。
函数应用提供的服务
函数主机注册许多服务。 以下服务可以安全地用作应用程序中的依赖项:
如果存在你要依赖的其他服务,请在 GitHub 上创建一个问题并提出它们。
替代主机服务
目前不支持替代由主机提供的服务。 如果有要替代的服务,请在 GitHub上创建并提出问题。
使用选项和设置
在应用设置中定义的值可以在 IConfiguration
实例中使用,这使得你可以读取启动类中的应用设置值。
可以将 IConfiguration
实例中的值提取为自定义类型。 如果将应用设置值复制到自定义类型,则通过使这些值可注入,可以轻松地测试服务。 读入到配置实例中的设置必须是简单的键/值对。 对于在弹性高级计划中运行的函数,应用程序设置名称只能包含字母、数字 (0-9
)、句点 (.
)、冒号 (:
) 和下划线 (_
)。 有关详细信息,请参阅应用设置注意事项。
请考虑以下类,其中包含一个命名与应用设置一致的属性:
public class MyOptions
public string MyCustomSetting { get; set; }
还有一个 local.settings.json
文件,该文件可能按如下所示组织自定义设置:
"IsEncrypted": false,
"Values": {
"MyOptions:MyCustomSetting": "Foobar"
在 Startup.Configure
方法内,可以使用以下代码从 IConfiguration
实例将值提取到自定义类型中:
builder.Services.AddOptions<MyOptions>()
.Configure<IConfiguration>((settings, configuration) =>
configuration.GetSection("MyOptions").Bind(settings);
调用 Bind
可以将那些与属性名匹配的值从配置复制到自定义实例中。 IoC 容器中现在提供可以注入到函数中的选项实例。
选项对象作为泛型 IOptions
接口的实例注入函数中。 使用 Value
属性访问在配置中发现的值。
using System;
using Microsoft.Extensions.Options;
public class HttpTrigger
private readonly MyOptions _settings;
public HttpTrigger(IOptions<MyOptions> options)
_settings = options.Value;
有关详细信息,请参阅 ASP.NET Core 中的选项模式。
使用 ASP.NET Core 用户机密
在本地开发应用时,ASP.NET Core 提供了一个机密管理器工具,可用于将机密信息存储在项目根目录之外。 这使得机密意外提交到源代码管理的可能性更小。 Azure Functions Core Tools(版本 3.0.3233 或更高版本)会自动读取 ASP.NET Core 机密管理器创建的机密。
若要将 .NET Azure Functions 项目配置为使用用户机密,请在项目根目录中运行以下命令。
dotnet user-secrets init
然后,使用 dotnet user-secrets set
命令创建或更新机密。
dotnet user-secrets set MySecret "my secret value"
若要在函数应用代码中访问用户机密值,请使用 IConfiguration
或 IOptions
。
自定义配置源
若要指定其他配置源,请替代函数应用的 StartUp
类中的 ConfigureAppConfiguration
方法。
以下示例同时从基本和可选的特定于环境的应用设置文件中添加配置值。
using System.IO;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
[assembly: FunctionsStartup(typeof(MyNamespace.Startup))]
namespace MyNamespace;
public class Startup : FunctionsStartup
public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
FunctionsHostBuilderContext context = builder.GetContext();
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)
.AddEnvironmentVariables();
public override void Configure(IFunctionsHostBuilder builder)
将配置提供程序添加到 IFunctionsConfigurationBuilder
的 ConfigurationBuilder
属性。 有关使用配置提供程序的详细信息,请参阅 ASP.NET Core 中的配置。
FunctionsHostBuilderContext
是从 IFunctionsConfigurationBuilder.GetContext()
中获取的。 使用此上下文检索当前环境名称,并解析函数应用文件夹中配置文件的位置。
默认情况下,配置文件(如 appsettings.json
)不会自动复制到函数应用的输出文件夹。 更新 .csproj
文件以匹配以下示例,从而确保文件已复制。
<None Update="appsettings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="appsettings.Development.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
</None>
有关详细信息,请参阅以下资源:
如何监视函数应用
函数的最佳做法