【问题标题】:Connect to REST API thru Proxy from Azure Functions(c#)从 Azure Functions(c#)通过代理连接到 REST API
【发布时间】:2020-05-28 02:18:54
【问题描述】:

我创建了一个 Azure Function(C#, ASP.net core 3.1)(A) 以通过 Squid 代理服务器访问 API(Azure Function(B)) 以将源端口更改为 Function(B)。(配置信息如下所示。)

我可以通过代理访问 Azure Function(B),但源端口没有改变。

当我访问 Function(B) 两次时,squid 代理服务器只记录了第一次访问。 但是 Function(B) 记录了它每次都是通过代理访问的。(记录的代理 IP 地址。)

请告诉我 Function(A) 和 Proxy 之间的连接发生了什么, 以及如何更改 Function(A) 或 squid 配置。

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

Function(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 core 3.1.2
  • 鱿鱼 v3.5.27
  • 鱿鱼服务器操作系统:ubuntu 18.04
    • squid 服务器是 Azure VM

【问题讨论】:

    标签: c# azure asp.net-core proxy squid


    【解决方案1】:

    我自己解决了这个问题。 当我访问外部 API 而不是 Function(B) 时,不同请求的源端口是不同的。 我认为相同源端口的原因是 Azure Functions 返回值为 keep-alive 的连接标头。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-01
      • 2010-12-28
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多