Web API报Action Not Found:如何正确调用接收两参数的控制器接口?
解决"No action or method matched"错误:正确调用接收两个参数的POST API
看起来你遇到的核心问题是错误地用AddHeader来传递请求体数据,这直接导致后端无法正确解析你发送的参数,所以找不到匹配的API方法。咱们一步步来修正:
你的代码里的关键问题
AddHeader是用来添加HTTP请求头的,不是传递请求体内容的载体——你把JSON数据塞进Header里,后端完全识别不到这是接口需要的业务参数- 重复添加两次
RequestBody类型的参数,会导致请求体格式混乱,后端根本没法解析出有效数据 - 没有用RestSharp官方推荐的方式构造JSON请求体
正确的实现方式
首先要明确:后端接收两个参数通常有两种合理的传递方案,咱们分别对应处理:
方案1:后端接收一个包含两个模型的复合对象(最推荐)
假设你的后端Action定义是这样的:
[HttpPost("Payment/SyncWithIrd")] public IActionResult SyncWithIrd([FromBody] SyncRequest request) { // request包含bmodel和mode对应的属性 } public class SyncRequest { public BModel BModel { get; set; } public Mode Mode { get; set; } }
那你的RestSharp代码应该改成这样:
RestService.BaseUrl = baseUrl; var client = RestService.Instance; // 先把两个参数打包成一个复合对象 var requestBody = new { BModel = bmodel, Mode = mode }; var request = RestService.GetRestRequest("Payment/SyncWithIrd", Method.POST); request.RequestFormat = DataFormat.Json; // 用AddJsonBody添加请求体,这是RestSharp处理JSON请求的标准方式 request.AddJsonBody(requestBody); // 无需手动添加Content-Type,RestSharp会自动处理 var response = client.Execute(request); var value = response.Content; return value;
方案2:后端直接接收两个独立参数(需后端特殊配置)
如果后端Action是直接接收两个独立的JSON参数(注意:ASP.NET Core默认不支持这种方式,需要额外配置):
[HttpPost("Payment/SyncWithIrd")] public IActionResult SyncWithIrd([FromBody] BModel bmodel, [FromBody] Mode mode) { // ... }
这种场景下,因为HTTP请求体只能有一个,所以你要么把两个参数合并成一个JSON对象传递(和方案1一致),要么后端修改成接收复合对象。如果非要传两个独立参数,可能需要改用FormData传递,但这不符合JSON请求的常规场景,优先推荐方案1。
额外检查点
- 确保
bmodel和mode序列化成JSON后,属性名和后端API的参数结构完全匹配(注意大小写,或者后端配置了忽略大小写) - 如果你用的是RestSharp v107+版本,可以简化代码:
var client = new RestClient(baseUrl);,然后用client.PostJsonAsync方法更简洁 - 再核对一遍API路由拼写、HTTP方法是否和后端完全一致
这样调整后,后端就能正确识别你的参数,匹配到对应的API方法,不会再出现"No action or method matched"的错误了。
内容的提问来源于stack exchange,提问作者Binod Bajracharya
相关产品推荐
相关产品推荐

