现有URL的WebRequest请求失效:原正常代码突然无法工作
解决异步请求PDF生成接口返回404的问题
看起来你遇到的问题是PDF生成接口因为处理耗时较长,导致请求直接返回404,但实际上接口是存在的,而且你怀疑是async/await的问题。先看看你的代码:
var request = System.Net.WebRequest.Create($"http://moachingtestweb.azurewebsites.net/FoodPlanner/Pdf?foodplanId={foodplanId}"); //var request = System.Net.WebRequest.Create($"https://application.moaching.com/FoodPlanner/Pdf?foodplanId={foodplanId}"); //TODO for prod. Add to config. request.Method = "GET"; var response = await request.GetResponseAsync(); var stream = response.GetResponseStream(); return new FileStreamResult(stream, "application/pdf");
首先先帮你排除async/await本身的问题——你这里的写法语法上是完全正确的,await request.GetResponseAsync()确实会等待异步请求完成,不会因为异步机制没生效导致提前返回。问题大概率出在超时配置或者接口端的路由/处理逻辑上,给你几个排查方向:
调整请求端超时时间:
System.Net.WebRequest的默认超时可能不足以支撑PDF生成的耗时,你可以手动设置更长的超时值试试:request.Timeout = 300000; // 设置为5分钟,可根据实际生成时长调整重点排查服务器端超时配置:如果你用的是Azure Web Apps这类托管服务,它默认有请求超时限制(比如230秒),如果PDF生成超过这个时间,服务器会直接返回404/502而非等待处理完成。你可以:
- 在Azure门户进入你的应用服务,通过「配置」->「常规设置」调整「请求超时」时长;
- 检查后端生成PDF的代码,看是否有内部超时逻辑导致提前终止并返回错误。
验证路由与参数合法性:先直接在浏览器里带上具体的
foodplanId访问这个URL,确认是否能正常返回PDF。如果浏览器访问也返回404,那可能是参数有特殊字符未编码,或者路由配置发生了变化。换成更现代的
HttpClient:WebRequest是较旧的API,HttpClient的异步处理更稳定、配置更灵活,推荐替换成以下写法:private readonly HttpClient _httpClient; // 通过依赖注入注入HttpClient(符合.NET最佳实践) public YourController(HttpClient httpClient) { _httpClient = httpClient; _httpClient.Timeout = TimeSpan.FromMinutes(5); // 设置超时时间 } public async Task<IActionResult> YourAction(int foodplanId) { var url = $"http://moachingtestweb.azurewebsites.net/FoodPlanner/Pdf?foodplanId={foodplanId}"; var response = await _httpClient.GetAsync(url); // 确保响应成功,否则抛出异常或处理错误 response.EnsureSuccessStatusCode(); var stream = await response.Content.ReadAsStreamAsync(); return new FileStreamResult(stream, "application/pdf"); }
如果以上方法都没解决问题,建议用抓包工具(比如Fiddler)或浏览器开发者工具查看请求/响应的详细头信息,确认404是真的路由不存在,还是服务器超时返回的“假404”。
内容的提问来源于stack exchange,提问作者Loc Dai Le
相关产品推荐
相关产品推荐

