Подключиться к REST API через прокси из Azure функций (c#) - PullRequest
1 голос
/ 28 мая 2020

Я создаю Azure Function (C#, ASP. net core 3.1) (A) для доступа к API (Azure Function (B)) через прокси-сервер Squid, чтобы изменить порт источника для функции (B). (информация о конфигурации показана ниже.)

Я могу получить доступ к Azure функции (B) через прокси, но порт источника не изменяется.

Когда Я дважды обращался к функции (B), прокси-сервер squid зарегистрировал только первый доступ. Но функция (B) регистрируется, к ней каждый раз обращались через прокси. (Зарегистрированный IP-адрес прокси.)

Пожалуйста, скажите мне, что происходит при соединении между функцией (A) и прокси, и как мне изменить функцию (A) или конфигурация squid.

┌────────────────────┐
│ Azure Function (A) │
└────────────────────┘
         ↓
         ↓
 ┌──────────────┐
 │ Proxy Server │
 └──────────────┘
         ↓
         ↓
┌────────────────────┐
│ Azure Function (B) │
└────────────────────┘

Код функции (A) находится здесь.

// startup.cs
// Setting DI and using Proxy
[...]
public override void Configure(IFunctionsHostBuilder builder)
{
    [...]
    builder.Services.AddHttpClient<IApiCallLogic, ApiCallLogic>(c => { })
                    .ConfigurePrimaryHttpMessageHandler(() =>
                    {
                        var handler = new HttpClientHandler { UseProxy = true };
                        handler.Proxy = new WebProxy($"http://xxx.xxx.xxx.xxx:xxx"); // proxy's IP & port
                        return handler;
                    });
}
// call REST API Logic with DI
class ApiCallLogic : IApiCallLogic
{
    private HttpClient httpClient;

    public ApiCallLogic(HttpClient httpClient)
    {
        this.httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient));
    }

    public async Task<HttpResponseMessage> CallApi(string url, ILogger log)
    {
        var reqMessage = new HttpRequestMessage(HttpMethod.Get, url);
        var response = await httpClient.SendAsync(reqMessage);
        return response;
    }
}

А squid.conf выглядит так.

# allow Function IP
acl function_net src xxx.xxx.xxx.xxx
http_access allow function_net

# deny others
http_access deny all

# no cache
cache deny all

# set port
http_port xxxx

forwarded_for off

# persistent connection setting
server_persistent_connections off
client_persistent_connections on

  • asp. net ядро ​​3.1.2
  • squid v3.5.27
  • ОС сервера squid: ubuntu 18.04
    • сервер squid Azure ВМ

1 Ответ

0 голосов
/ 08 июня 2020

Я сам решил эту проблему. Когда я обращался к внешнему API, а не к функции (B), исходные порты для разных запросов были разными. Я думаю, что причина тех же исходных портов в том, что Azure функции возвращают заголовок соединения со значением keep-alive.

...