API请求失败排查:HttpRequestException与HttpIOException异常分析
API自调用抛出请求异常的可能原因
我有一个API,能正常处理worker发来的POST和GET请求,但自己发送POST或GET请求时,会抛出以下异常:
HttpRequestException: An error occurred while sending the request.
HttpIOException: The response ended prematurely. (ResponseEnded)
已知问题出在服务器/API端,以下是调用失败的其中一个端点代码:
app.MapPost("/jobs/{id}/delete", async (Guid id) => { if (jobs[id].Status == "Processing") return Results.BadRequest("Cannot delete a job that is being processed."); jobs.TryRemove(id, out _); lock (_fileLock) { SaveData(jobs, jobQueue, jsonJobs, jsonQueue); } return Results.Ok(); });
相关项目代码已上传至GitHub仓库,若不信任文件可查看名为"IF YOU DONT TRUST"的文件。
可能的故障原因
- 自调用地址/端口问题:如果API在本地或容器内运行,自调用时用了错误的地址(比如容器内用
localhost指向自身而非宿主机API),或者端口被占用,都会导致请求无法正常完成,触发响应提前结束的异常。 - 同步锁阻塞线程池:端点里的
lock (_fileLock)会阻塞当前线程,如果SaveData写文件耗时久,自调用时可能因为并发请求占满线程池,后续请求得不到处理,最终超时抛出异常。worker请求频率低,线程资源充足,所以没触发问题。 jobs字典线程不安全:直接访问jobs[id]没加锁,自调用并发请求时可能出现字典状态异常(比如键不存在、修改冲突),引发未捕获的错误,导致响应提前终止。worker请求可能有同步机制,所以没出问题。SaveData内部IO异常:SaveData写文件时可能遇到权限不足、文件被占用等IO错误,但没捕获异常,导致请求未正常返回响应,客户端收到提前结束的错误。worker环境的文件权限或访问方式不同,所以没触发。- 客户端超时配置差异:自调用用的HttpClient超时设置过短,而worker的客户端超时更长。当
SaveData耗时超过自调用客户端的超时时间,就会抛出HttpRequestException,worker请求则能正常等待完成。
内容的提问来源于stack exchange,提问作者Schulklasse10
相关产品推荐
相关产品推荐

