.NET 6中NSwag生成客户端无法调用ASP.NET Core Web API的PUT接口
问题分析与解决
核心问题
你的PUT接口路由配置错误,同时客户端调用方式不符合规范:
- 控制器中
[HttpPut("UpdateLesson/{lesson}")]试图将复杂对象Lesson作为路由参数,HTTP路由仅支持简单类型(如int、string),复杂对象需通过请求体传递。 - 客户端调用时手动序列化
Lesson并传递两个参数,和接口定义不匹配,导致NSwag生成的客户端无法正确构造请求。
修复步骤
1. 修正控制器的PUT接口
修改LessonEditController中的UpdateLesson方法,移除路由中的{lesson}参数,并显式指定参数从请求体获取:
[HttpPut("UpdateLesson")] [ProducesResponseType(StatusCodes.Status204NoContent)] public IActionResult UpdateLesson([FromBody] Lesson lesson) { if (lesson.Homework == null) { lesson.Homework = ""; } if(lesson.Theme == null) { lesson.Theme = ""; } _db.Lessons.Update(lesson); _db.SaveChanges(); return NoContent(); }
2. 修正客户端调用代码
NSwag生成的客户端会自动处理对象序列化和请求体封装,无需手动序列化,直接传递Lesson对象即可:
using JournalEditService.Models; using Services; using Microsoft.EntityFrameworkCore; var httpClient = new HttpClient(); var client = new Client("https://localhost:7051", httpClient); Lesson lesson; using(SchoolJournalContext db = new SchoolJournalContext()) { lesson = db.Lessons.First(x => x.Id == 2); } lesson.Homework = "Some homework"; // 直接传递lesson对象,客户端自动处理序列化和请求体 var response = await client.UpdateLessonAsync(lesson); // 建议用await等待请求完成,而非仅检查IsCompleted bool isSuccess = response.IsSuccessStatusCode;
3. 重新生成NSwag客户端
修改控制器后,重新生成NSwag客户端,确保客户端方法签名和修正后的接口匹配。
验证
重新启动API服务和客户端项目,调用PUT接口后,请求会正确将Lesson对象作为请求体发送,接口可正常接收并处理请求。
内容的提问来源于stack exchange,提问作者Nikolay Pisklov
相关产品推荐
相关产品推荐

