如何从ASP.NET Core MVC向ASP.NET Core Web API发送PUT请求
问题原因与解决方案
核心错误原因
出现405 Method Not Allowed且请求未命中控制器,是以下3个配置不匹配导致的:
- 路由规则不匹配:你的PUT接口定义了路由
api/[controller]/{customer},要求URL最后必须携带名为customer的路由参数,但你调用时请求地址为api/Customer/,没有对应路由参数,路由匹配失败自然找不到对应的PUT接口。 - 参数绑定规则错误:接口的
Customer复杂类型参数没有指定来源,ASP.NET Core默认不会主动从JSON请求体绑定复杂类型参数,导致即使路由匹配,请求也无法被正确解析。 - 路由设计冗余:你是将整个
Customer对象放在请求体中提交,不需要在路由里配置{customer}参数,该配置属于多余规则。
修复步骤
1. 修正API端接口配置
修改PUT接口的特性如下:
[HttpPut] [Route("api/[controller]")] // 路由和你调用时的地址对齐,也可以自定义如api/[controller]/Edit public IActionResult EditCustomer([FromBody] Customer customer) // 加[FromBody]指定从请求体绑定参数 { var cust = _customerData.EditCustomer(customer); if (cust == string.Empty) { return Ok(); } else { return new StatusCodeResult(StatusCodes.Status500InternalServerError); } }
2. 确认调用端请求地址匹配
你当前调用的地址api/Customer/和上面修正后的路由已经匹配,如果修改了路由规则,要同步调整PutAsJsonAsync的第一个参数,确保两端路由完全一致。
其他潜在问题修复
你贴出的Customer模型类中没有定义Name属性,但在EditCustomer数据操作方法中用到了pro.Name = customer.Name,会触发空引用异常,需要在Customer类中补充Name属性:
public class Customer { [Required] public Guid CustomerId { get; set; } public int Age { get; set; } public int Phone { get; set; } public string Name { get; set; } // 补充缺失的Name属性 }
可选排查项
如果完成上面修改后还是报405,可以检查两个常见配置:
- 检查CORS配置:如果是跨域请求,要确保CORS规则允许PUT方法的访问。
- 检查IIS WebDAV配置:IIS默认启用的WebDAV模块会拦截PUT/DELETE请求,可以在web.config中禁用该模块解决拦截问题。
内容的提问来源于stack exchange,提问作者Psychonaut007
相关产品推荐
相关产品推荐

