将开发代理与 .NET Azure Functions 配合使用

如果使用 .NET 生成 Azure Functions 并想要使用开发代理,请按照有关将 开发代理与 .NET 应用程序配合使用的一般指南进行作。

重要

若要防止 Azure Functions 在启动时失败,请启动开发代理,不要将其注册为系统代理,可以使用--as-system-proxy false选项,或在devproxyrc.json文件中配置asSystemProxyfalse。 如果将开发代理注册为系统代理,则 Azure Functions 在启动时失败,并显示类似于以下内容的错误消息:

Grpc.Core.RpcException: 'Status(StatusCode="Internal", Detail="Error starting gRPC call. HttpRequestException: Requesting HTTP version 2.0 with version policy RequestVersionOrHigher while unable to establish HTTP/2 connection.", DebugException="System.Net.Http.HttpRequestException: Requesting HTTP version 2.0 with version policy RequestVersionOrHigher while unable to establish HTTP/2 connection.")'

为了能够在开发中使用开发代理而不是在生产环境中使用它之间轻松切换,最好使用环境变量在 Azure Functions 应用中配置代理。 更改 local.settings.json 文件以包含 HTTPS_PROXY 环境变量。

{
  "IsEncrypted": false,
  "Values": {
    "HTTPS_PROXY": "http://127.0.0.1:8000"
  }
}

HttpClient .NET 中的 会自动选取 HTTPS_PROXY 环境变量,并使用它为传出 HTTP 请求配置代理。

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

namespace dotnet_azure_fn;

public class MyFn(ILogger<MyFn> logger, IHttpClientFactory httpClientFactory)
{
    private readonly ILogger<MyFn> _logger = logger;
    private readonly HttpClient _httpClient = httpClientFactory.CreateClient();

    [Function("MyFn")]
    public async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req)
    {
        _logger.LogInformation("C# HTTP trigger function processed a request.");

        var result = await _httpClient.GetAsync("https://jsonplaceholder.typicode.com/posts");
        if (result.IsSuccessStatusCode)
        {
            return new OkObjectResult(await result.Content.ReadAsStringAsync());
        }
        else
        {
            _logger.LogError("HTTP request failed.");
            return new StatusCodeResult(StatusCodes.Status500InternalServerError);
        }
    }
}