【问题标题】:Web API controller with two PUT methods throw an InvalidOperationException具有两个 PUT 方法的 Web API 控制器抛出 InvalidOperationException
【发布时间】:2015-03-11 08:37:16
【问题描述】:

我正在使用 .NET Framework 4.5.1 和 C# 开发一个 ASP.NET Web Api 2.2 应用程序。

我有一个使用这种方法的控制器:

public HttpResponseMessage Get(
    string productCode,
    byte codeLevel,
    string productionOrderName,
    string batchName,
    string lineName,
    int quantity)
{

这就是我在WebApiConfig 上配置其路由的方式:

config.Routes.MapHttpRoute(
    name: "ExternalCodesActionApi",
    routeTemplate: "api/ExternalCodes/{action}/{productCode}/{codeLevel}/{productionOrderName}/{batchName}/{lineName}/{quantity}",
    defaults: new { controller = "ExternalCodes" });

但现在我在同一个控制器上有另一种方法 (ExternalCodesController):

[HttpPut]
public HttpResponseMessage SetCodesAsUsed(List<string> codes)
{

但是,使用该路线,当我使用该方法 (http://myHost:53827/api/ExternalCodes/SetCodesAsUsed) 时,我会收到带有以下消息的 InvalidOperationException

“找到了几个与请求匹配的操作:

SetCodesAsUsed 类型 MyProject.Web.API.Controllers.ExternalCodesController

SetCodesAsUnUsed 类型 MyProject.Web.API.Controllers.ExternalCodesController",

在同一个ExternalCodesController中还有另一种方法:

[HttpPut]
public HttpResponseMessage SetCodesAsUnUsed(List<string> codes)
{

我做错了什么?

这些方法有不同的名称。

【问题讨论】:

标签: c# asp.net asp.net-web-api asp.net-web-api-routing


【解决方案1】:

web api 不太关注方法名称 - 它只看到两个具有相同签名的 PUT。

Web API 2 Attribute Routing 是解决此问题最方便的方法,因为它可以轻松地在 RESTful API 中混合 RPC 调用

例如:

[HttpPut]
[Route("api/ExternalCodes/SetCodesAsUnUsed")]
public HttpResponseMessage SetCodesAsUnUsed(List<string> codes)

[HttpPut]
[Route("api/ExternalCodes/SetCodesAsUsed")]
public HttpResponseMessage SetCodesAsUsed(List<string> codes)

【讨论】:

  • 此答案中的路由模板不遵循推荐的 RESTful Web API 资源命名。 (阅读:restapitutorial.com/lessons/restfulresourcenaming.html)有更好的方法吗?
  • 根据您的链接定义,我认为您可能需要两个控制器,每个控制器都有一个 PUT?例如:PUT /api/UnsedExternalCodes 和 PUT /api/UsedExternalCodes。
  • 正是我需要的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-18
  • 2012-07-09
相关资源
最近更新 更多