【发布时间】:2015-04-26 09:38:09
【问题描述】:
我在 ASP.NET Web API 项目中的控制器上有以下操作方法:
[Route("api/v2/project/{projectId}/stuff"), HttpGet]
public IHttpActionResult Get(int projectId)
[Route("api/v2/project/{projectId}/stuff/{id:guid}"), HttpGet]
public IHttpActionResult Get(int projectId, [FromUri] Guid id)
[Route("api/v2/project/{projectId}/stuff"), HttpPost]
public IHttpActionResult Post(int projectId, [Required] Stuff stuff)
[Route("api/v2/project/{projectId}/stuff/{id:guid}"), HttpPut]
public IHttpActionResult Put(int projectId, [FromUri] Guid blastId, Stuff stuff)
[Route("api/v2/project/{projectId}/stuff/{id:guid}"), HttpDelete]
public IHttpActionResult Delete(int projectId, [FromUri] Guid id)
由于 javascript 错误,我向
发出了DELETE 请求
api/v2/project/1234/stuff/undefined
即而不是GUID 的id,我得到了字符串"undefined"。据我所知,这不应该与我的任何路线匹配,但不是404 Not found(甚至405 Method not allowed),而是200 OK 作为响应。
我在每个操作方法中都设置了一个断点,并使用 Fiddler 重复请求,但没有一个断点被命中。我还尝试从 nuget 安装 WebApiRouteDebugger 包,但我们使用的是自定义控制器工厂,它通过我们的 DI 容器连接东西,所以我根本无法让它工作。我什至尝试从我的全局注册过滤器之一中抛出以下异常:
throw new Exception(actionContext.ControllerContext.ControllerDescriptor.ControllerName +
" " + actionContext.ActionDescriptor.ActionName);
但DELETE 请求仍然 转到200 OK(似乎没有对有效网址的请求)。
我还能如何解决这个问题?根本原因可能是什么?
【问题讨论】:
-
我创建了新的 Web APi 项目并添加了带有您的测试方法和路由的控制器。不幸的是工作正常。对于 url 'api/v2/project/{project Id}/stuff/{id:guid}' 我有 404 错误。我认为其他控制器中的路由不正确或 url 与其他路由的“未定义”匹配是问题。
-
@BartoszCzerwonka:非常感谢您抽出时间来做这件事。这个项目很大,这就是为什么我没有在整个项目中包含所有路由 - 但是,我已经仔细检查过,除了这个控制器之外,项目中根本没有匹配
api/v2/project/{projectId}/stuff/<anything or nothing>的路由. -
此外,其中只有一个应该接受
DELETE请求 - 那是没有命中断点的那个。 -
您可以发布您的 WebApiConfig.cs 的代码吗?
-
@Josh:我发布了它(带有一些额外的 cmets)here,以避免混淆问题。
标签: asp.net asp.net-web-api routing