HttpClient请求不适用于Azure中的特定域



我有一个Azure函数,它向URL发送请求并发回响应。此功能一直失败,来自特定域的URL出现超时错误(机密(。

为了调试它,我创建了一个非常简单的Azure函数:

var content = string.Empty;
using (var response = await _httpClient.GetAsync(url))
{
response.EnsureSuccessStatusCode();
content = await response.Content.ReadAsByteArrayAsync();
}
return new OkObjectResult(content);

此代码在本地运行良好。当我尝试使用部署的Azure功能时,它适用于我尝试过的所有其他域(例如:https://google.com)但在尝试了大约90秒后,它遇到了特定域的请求超时错误。错误发生在以下特定行:_httpClient。GetAsync(url(。同样,它适用于本地的这个(机密(域。

我已经尝试将Azure功能部署到两个完全不同的Azure服务计划和地区。同样的结果。它不适用于来自所需域的URL。适用于其他域的URL。

错误:

System.IO.IOException: Unable to read data from the transport connection: The I/O operation has been aborted because of either a thread exit or an application request..

更新(解决方案(:

我尝试从Postman发送一个请求,从那里复制C#的代码,并将其部署到Azure函数中,现在它正在为有问题的域工作。如下所示:

var client = new RestClient(url);
client.Timeout = -1;
var request = new RestRequest(Method.GET);
IRestResponse response = client.Execute(request);

这里的关键是client.Timeout = -1,它似乎已经解决了这个问题。

现在,在我的原始代码中,我尝试将HttpClient的超时设置为timeout。InfiniteTimeSpan既在启动配置中,也在单个请求级别上,但它不起作用。

services.AddHttpClient("AzureTestClient", options =>
{
options.Timeout = Timeout.InfiniteTimeSpan;
});

我在HttpClient解决方案中设置的超时是否错误?

  1. 如果您正在使用消费计划,那么机密URL可能需要将整个Azure数据中心列入白名单。您可以按照这里的指南进行操作,也可以考虑将消费计划升级为高级计划,并拥有一个专用的链接VNET。也许你的本地机器已经链接到域/白名单,所以azure功能在不同的范围内运行。

  2. 另一个原因可能是URL返回了一个不同的HttpStatusCode,它不是成功的范围(200-299(;EnsureSuccessStatusCode;在旧代码中?

通常对于http代码初始化,我做了类似的事情:

public void Configure(IWebJobsBuilder builder)
{
builder.Services.AddHttpClient("AzureTestClient",
options => { options.Timeout = Timeout.InfiniteTimeSpan; });
}

然后,当我想使用它时,我确实喜欢在任何其他功能中使用它,它起到了作用:

var client = clientFactory.CreateClient("AzureTestClient");

最新更新