Controller调用API时Json DeserializeObject报错求助
问题排查与解决
从错误截图(显示HttpRequestException: 无法连接到远程服务器)和你的代码来看,问题出在无法成功访问目标API https://localhost:5001/api/Authors,以下是常见原因和解决步骤:
1. 确认目标API是否正常运行
- 直接在浏览器或API测试工具(如Postman)中访问
https://localhost:5001/api/Authors,验证是否能正常返回数据。 - 检查API项目的启动端口是否为5001,排查是否存在启动失败(如端口被占用)的情况。
2. 处理HTTPS证书信任问题
本地开发的HTTPS服务默认使用自签名证书,HttpClient可能因不信任证书拒绝连接:
- 临时方案:改用HTTP协议调用(修改地址为
http://localhost:5000/api/Authors,注意对应API的HTTP端口)。 - 永久方案:信任本地开发HTTPS证书,打开管理员权限的命令行执行:
dotnet dev-certs https --trust
3. 给代码添加响应校验逻辑
你的代码未校验API响应状态,即使API返回错误(如404、500),仍会尝试反序列化内容,易引发额外异常。修改代码如下:
public async Task<IActionResult> Index() { List<Author>? authorList = new List<Author>(); using (var httpClient = new HttpClient()) { using (var response = await httpClient.GetAsync("https://localhost:5001/api/Authors")) { // 确保API返回成功状态码 response.EnsureSuccessStatusCode(); string apiResponse = await response.Content.ReadAsStringAsync(); authorList = JsonConvert.DeserializeObject<List<Author>>(apiResponse); } } return View(authorList); }
4. 检查端口占用情况
如果API启动时报端口被占用,打开命令行执行以下命令找到占用进程并关闭:
netstat -ano | findstr :5001 taskkill /F /PID <找到的PID>
内容的提问来源于stack exchange,提问作者Bassam Alqadhi
相关产品推荐
相关产品推荐

