You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Function调用API遇EOF错误 大请求失败求配置方案

问题描述

我在Azure Function App托管的API中,通过代码调用另一个同样托管在Azure Function App的PUT接口。当请求包含近600行数据时,会抛出错误:received an unexpected EOF or 0 bytes from the transport stream;但发送100-150行数据的请求可以成功处理。我认为问题和代码无关,属于Azure Function App的配置问题,请问需要添加哪些配置来解决?

相关代码如下:

public async Task<List<CarPricing>> TestMethod(CarPricingModel request, string resourcePath,string token)
{
    try
    {
        using var stream = StreamUtility.GenerateStreamFromString(JsonConvert.SerializeObject(request));

        using var data= new StreamContent(stream);
        data.Headers.ContentType = new MediaTypeHeaderValue("application/json");

        var queryParams = new Dictionary<string, string>()
        {
           {"id", "XXXXXXXXXXXXXXXXXXXXXX" } 
        };
        var relativeUrl = QueryHelpers.AddQueryString(resourcePath, queryParams);

        using var requestMessage = new HttpRequestMessage
        {
            Method = HttpMethod.Put,
            Content = content,
            RequestUri = new Uri(relativeUrl, UriKind.Relative)
        };

        var httpResponseMessage = await _httpClient.SendAsync(requestMessage);
        httpStatusCode = httpResponseMessage.StatusCode;

        var httpResponse = await httpResponseMessage.Content.ReadAsStreamAsync();
        using var responseContent = new JsonTextReader(new StreamReader(httpResponse));
        var response = new JsonSerializer().Deserialize<List<CarPricing>>(responseContent);

        return response;
    }
    catch (Exception ex)
    {
        _log.LogError("API error {err_msg}",ex.Message);
        throw;
    }
}
配置调整方案

1. 修改host.json的请求大小与并发限制

直接在被调用的Function App的host.json文件里,添加或修改http配置项,放宽请求体大小和并发处理限制:

{
  "version": "2.0",
  "extensions": {
    "http": {
      "maxOutstandingRequests": 200,
      "maxConcurrentRequests": 100,
      "requestBodySizeLimit": 104857600 // 设为100MB,可根据实际数据大小调整
    }
  }
}

默认requestBodySizeLimit是100MB,但如果之前被修改过小,必须调大到能容纳600行数据的JSON体积。

2. 调整App Service门户的请求限制

登录Azure门户,进入被调用的Function App:

  • 打开配置 > 常规设置
  • 在请求限制区域,把**最大请求体大小(MB)**设为合适值(比如100MB)
  • 同时检查超时(分钟),如果大请求处理耗时久,从默认4分钟调至10分钟左右

3. 优化调用方HttpClient的配置

在发起请求的Function App里,确保HttpClient的超时时间足够长,避免因大请求处理慢导致连接提前断开:

// 初始化HttpClient时设置超时
_httpClient.Timeout = TimeSpan.FromMinutes(10);

另外可以添加连接优化配置,防止握手或连接复用问题:

var handler = new HttpClientHandler
{
    MaxConnectionsPerServer = 100,
    AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate,
    // 禁用Expect-Continue,避免大请求时的额外握手延迟
    ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true // 生产环境建议验证证书,仅临时排查用
};
_httpClient = new HttpClient(handler);

4. 检查Function App的资源与计划配置

如果被调用的Function App资源不足,处理大请求时可能会强制终止连接:

  • 转到Azure门户的Function App > 规模
  • 避免使用消耗计划(有10分钟执行时间限制且资源受限),建议切换到弹性高级计划或专用(App Service)计划
  • 若坚持用消耗计划,确认函数执行超时设置合理

5. 开启详细日志排查

在被调用的Function App里开启详细日志,获取更精准的错误原因:

  • 打开监测 > 日志
  • 启用Application Insights,查看请求的完整追踪日志,确认是请求被截断、处理超时还是资源不足导致的EOF错误

内容的提问来源于stack exchange,提问作者suraj_123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 08:35:21