简体   繁体   English

通过 Azure 功能(c#)的代理连接到 REST API

[英]Connect to REST API thru Proxy from Azure Functions(c#)

I create a Azure Function(C#, ASP.net core 3.1)(A) to to access a API(Azure Function(B)) thru a Squid proxy server to change a source port to the Function(B).(config information is shown below.)我创建了一个 Azure Function(C#, ASP.net core 3.1)(A) 以通过 Squid 代理服务器访问 API(Azure Function(B)) 以将源端口更改为 Function(B)。(配置信息如下所示.)

I can access Azure Function(B) thru Proxy, but source port does not change.我可以通过代理访问 Azure 功能(B),但源端口没有改变。

When I accessed Function(B) twice, the squid proxy server logged the first access only.当我访问 Function(B) 两次时,squid 代理服务器只记录了第一次访问。 But Function(B) logged it was accessed thru the proxy every time.(logged proxy ip address.)但是 Function(B) 记录了它每次都是通过代理访问的。(记录的代理 ip 地址。)

Please tell me what happens on the connection between Function(A) and Proxy, and how do I change Function(A) or squid configuration.请告诉我 Function(A) 和 Proxy 之间的连接发生了什么,以及如何更改 Function(A) 或 squid 配置。

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

Function(A)'s code is here. 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;
    }
}

And squid.conf is like this.而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 asp.net芯3.1.2
  • squid v3.5.27鱿鱼 v3.5.27
  • squid server os: ubuntu 18.04鱿鱼服务器操作系统:ubuntu 18.04
    • squid server is Azure VM鱿鱼服务器是 Azure VM

I have solved this problem by myself.我自己解决了这个问题。 When I accessed an external API, not Function(B), source ports on different requests were different.当我访问外部 API,而不是 Function(B) 时,不同请求的源端口不同。 I think the cause of the same source ports is that Azure Functions return the Connection Header with the value keep-alive .我认为相同源端口的原因是 Azure 函数返回 Connection Header ,其值为keep-alive

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM