Контроллер веб-API с двумя методами PUT вызывает InvalidOperationException

Я разрабатываю приложение ASP.NET Web Api 2.2 с .NET Framework 4.5.1 и С#.

У меня есть контроллер с этим методом:

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)
{

Что я делаю не так?

Методы имеют разные названия.


person VansFannel    schedule 11.03.2015    source источник
comment
Я сомневаюсь, что конфликт возникает из-за того, что эти операции веб-API...   -  person Matías Fidemraizer    schedule 11.03.2015
comment
когда я помещаю в этот метод - показать запрос.   -  person CodeCaster    schedule 11.03.2015
comment
Это может вам помочь, asp.net/web-api/overview/web-api-routing-and-actions/   -  person sinanakyazici    schedule 11.03.2015


Ответы (1)


Веб-API не обращает особого внимания на имена методов — он просто видит два PUT с одинаковой сигнатурой.

Веб API 2 Attribute Routing — наиболее удобное решение этой проблемы, поскольку оно позволяет легко смешивать вызовы RPC в RESTful API.

eg:

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

[HttpPut]
[Route("api/ExternalCodes/SetCodesAsUsed")]
public HttpResponseMessage SetCodesAsUsed(List<string> codes)
person Neil Thompson    schedule 11.03.2015
comment
Шаблоны маршрутов в этом ответе не соответствуют рекомендуемому именованию ресурсов для RESTful Web API. (читайте: restapitutorial.com/lessons/restfulresourcenaming.html) Есть ли лучший подход ? - person Tohid; 23.01.2017
comment
Согласно определению вашей ссылки, я думаю, вам может понадобиться два контроллера, каждый с одним PUT? например: PUT /api/UnsedExternalCodes и PUT /api/UsedExternalCodes. - person Neil Thompson; 23.01.2017
comment
Как раз тот ответ, который мне был нужен. - person nahaelem; 11.05.2018