为什么参数名称对 Web Api 很重要 id 有效而 memberId(均为 int)无效

Why would the parameter name matter with Web Api id works while memberId ( both int) does not work

就在多年编写和使用 web api 服务方法之后,我正在做一个项目,其中我从 Angular 调用然后当 web 中的断点 api没有被击中我正在使用邮递员。

我最终追踪到签名传入参数的简单名称

这不起作用

[HttpGet]
public IHttpActionResult GetActivityByMemberId(int memberId) {...}

"id" 有效,为什么 ??

[HttpGet]
public IHttpActionResult GetActivityByMemberId(int id) {...}

邮递员 & Angular 电话

http://localhost:49810/umbraco/api/activityapi/GetActivityByMemberId/2

当我什至没有在 Postman(测试)或 Angular $http.get 中指定参数名称时,我有点迷茫为什么我必须将参数名称更改为 "id" ...

帮我理解!请!

看来是路由参数匹配问题。很可能您正在使用基于约定的路由,并且 routeTemplate 有类似

的内容
// Convention-based routing.
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

它正在将路由模板中的参数名称与控制器操作中的参数名称进行匹配。

阅读 Routing and Action Selection in ASP.NET Web API 以更好地了解路由的工作原理

努力解释默认 WebAPI 配置中的相同情况。虽然这个查询是旧的,但发布这个以防万一这个替代方案可以帮助其他人!

Web API 中的默认路由配置是(没有操作,操作将根据请求的 Http 谓词选择):

config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

在这种情况下,预期的方法签名将使用变量名称 "id",如果您想使用路径“../api/ControllerName/5678”调用方法,则不会接受其他名称.

[HttpGet]
public IHttpActionResult GetActivityByMemberId(int id) {...}

但是,稍作调整即可使 URI 适用于任何变量名。只需将方法的签名更改为

[HttpGet]
public IHttpActionResult GetActivityByMemberId([FromUri(Name = "id")] int memberId) {...}