Поделиться через


Использование прокси-сервера разработки с функциями .NET Azure

Если вы создаете функции Azure с помощью .NET и хотите использовать прокси-сервер разработки, следуйте общим рекомендациям по использованию Прокси разработки с приложениями .NET.

Это важно

Чтобы предотвратить сбой работы Azure Functions при запуске, запустите прокси-сервер разработки без регистрации его в качестве системного прокси с помощью --as-system-proxy false параметра или настройте asSystemProxy на false в devproxyrc.json файле. Если вы регистрируете Dev Proxy в качестве системного прокси-сервера, функции Azure не запускаются при старте с сообщением об ошибке, аналогичным:

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 с помощью переменных среды. Измените файл 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);
        }
    }
}