You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 19:20:35