Condividi tramite


Usare Dev Proxy con Funzioni di Azure .NET

Se si compilano Funzioni di Azure con .NET e si vuole usare Dev Proxy, seguire le indicazioni generali per l'uso di Dev Proxy con applicazioni .NET.

Importante

Per impedire che le Funzioni di Azure falliscano all'avvio, avviare Dev Proxy senza registrarlo come proxy di sistema, utilizzando l'opzione --as-system-proxy false o configurando asSystemProxy a false nel file devproxyrc.json. Se si registra Dev Proxy come proxy di sistema, Funzioni di Azure non riesce all'avvio con un messaggio di errore simile al seguente:

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.")'

Per essere in grado di passare facilmente dall'uso di Dev Proxy in fase di sviluppo e non dall'uso nell'ambiente di produzione, è possibile configurare meglio il proxy nell'app Funzioni di Azure usando le variabili di ambiente. Modificare il local.settings.json file in modo da includere la HTTPS_PROXY variabile di ambiente.

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

HttpClient in .NET preleva automaticamente la HTTPS_PROXY variabile di ambiente e la usa per configurare il proxy per le richieste HTTP in uscita.

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);
        }
    }
}