ASP.NET Web API 2 переопределяет унаследованный атрибут действия маршрута найдено несколько действий - PullRequest
0 голосов
/ 07 июня 2018

Чтобы сохранить обзор в моем веб-API, я использую базовый контроллер, который содержит некоторые основные действия, которые использует большинство других моих контроллеров.(Например, Post([FromBody]JObject newFields) для добавления нового элемента.)

В моем проекте включена функция маршрутизации атрибутов.Итак, мой базовый контроллер выглядит примерно так:

public class BaseController<T> : ApiController where T : ObjectBase, new()
{
    [Route("")]
    [ResponseType(typeof(ObjectBase))]
    public virtual IHttpActionResult Post([FromBody]JObject newFields)
    {
        // Post logic
        return Ok();
    }
}

Я наследую этот базовый контроллер в большинстве других контроллеров в моем проекте.

Теперь для моей проблемы:

В одном из моих контроллеров я хочу переопределить этот метод, потому что некоторая логика создания отличается.

Это пример того, как я пытаюсь выполнить эту функциональность:

[RoutePrefix("api/Users")]
public class UsersController : BaseController<UserObject>
{
    [Route("")]
    [ResponseType(typeof(ObjectBase))]
    public override IHttpActionResult Post([FromBody]JObject newFields)
    {
        // Overridden post logic
        return Ok();
    }
}

Однако, когда я теперь отправляю запрос POST на https://url/api/Users, я получаю следующее сообщение об ошибке:

Сообщение:

Произошла ошибка.

ExceptionMessage:

Обнаружено несколько действий, соответствующих запросу:

Опубликовать тип WebAPI.Controllers.UsersController

Запись по типу WebAPI.Controllers.UsersController

ExceptionType:

System.InvalidOperationException

StackTrace:

на System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction (HttpControllerContext controllerContext)

в System.Web.Http.ApiController.ExecuteAsync (HttpControllerContext controllerContext, CancellationToken *..MoveNext ()

Кто-нибудь, кто может помочь мне решить эту проблему?

Заранее спасибо!

1 Ответ

0 голосов
/ 08 июня 2018

Попробовав много вещей, я наконец нашел самое простое решение.Похоже, мне просто нужно было удалить атрибуты из моего производного класса.

Итак, чтобы следовать примеру, который я использовал в своем исходном сообщении, UsersController теперь выглядит так:

[RoutePrefix("api/Users")]
public class UsersController : BaseController<UserObject>
{
    public override IHttpActionResult Post([FromBody]JObject newFields)
    {
        // Overridden post logic
        return Ok();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...