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
相关产品推荐
相关产品推荐

