ASP.NET Web API DELETE请求触发Get方法报错:参数'id'传入null
解决ASP.NET Web API DELETE请求匹配到Get方法的错误
这个问题我之前也碰到过,本质是你的DELETE请求被错误路由到了Get(Int32)方法上,框架试图调用这个需要非空int参数的方法,但请求里没有传入有效的id值,所以抛出了这个参数为null的错误。下面一步步排查解决:
1. 检查控制器的Delete方法定义
首先确保你的TransactionController里的删除方法正确标记了HTTP动词,Web API需要明确识别哪个方法对应DELETE请求:
public class TransactionController : ApiController { // 正确的Delete方法:要么加[HttpDelete]特性,要么方法名以Delete开头 [HttpDelete] public IHttpActionResult Delete(int id) { // 这里写你的删除逻辑,比如删除数据库记录 if (删除成功) { return Ok("记录已删除"); } return NotFound(); } // 你的Get方法(报错里提到的那个) public string Get(int id) { // ... 原有的Get逻辑 } }
注意:如果方法名是DeleteXXX格式,Web API会自动识别为DELETE请求,但加上[HttpDelete]特性更明确,避免命名约定带来的歧义。
2. 验证jQuery AJAX请求的正确性
确保你的AJAX请求确实是DELETE类型,并且正确传递了id参数:
var transactionId = 123; // 这里要确保这个变量有有效的数值,不是null/undefined $.ajax({ url: '/api/Transaction/' + transactionId, // 必须包含id,比如/api/Transaction/123 type: 'DELETE', // 这里一定要写DELETE,不能写错成GET/POST contentType: 'application/json', success: function(response) { console.log("删除成功:", response); }, error: function(xhr, status, err) { console.error("删除失败:", err); } });
如果transactionId是null,请求URL会变成/api/Transaction/,这时候路由找不到匹配的Delete方法,就会尝试匹配Get方法,而Get方法要求非空的id,所以就会报错。
3. 检查Global.asax的Web API路由配置
Web API的路由规则决定了请求如何匹配到控制器方法,默认的路由配置应该是这样的:
protected void Application_Start() { // 注册Web API路由 RouteTable.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); }
这个默认路由会根据HTTP动词匹配对应的方法:
- DELETE请求
api/Transaction/123会匹配Delete(int id)方法 - GET请求
api/Transaction/123会匹配Get(int id)方法
如果你的路由配置有自定义规则,要确保没有把DELETE请求错误导向到Get方法,比如不要在路由里硬指定action为Get,或者路由顺序不对(更具体的路由要放在默认路由前面)。
如果需要更严格的路由约束,可以专门为DELETE请求添加路由:
RouteTable.Routes.MapHttpRoute( name: "DeleteTransaction", routeTemplate: "api/Transaction/{id}", defaults: new { controller = "Transaction", action = "Delete" }, constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Delete) } ); // 默认路由放在后面 RouteTable.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } );
最后验证
用Fiddler重新发送DELETE请求,确保:
- 请求方法是DELETE
- 请求URL包含有效的id(比如
http://localhost:xxxx/api/Transaction/123) - 响应状态码是200(成功)或者404(记录不存在),而不是之前的错误
内容的提问来源于stack exchange,提问作者Marcos Foster
相关产品推荐
相关产品推荐

