Подтвердить что ты не робот

Добавление явного маршрута действия в ASP.NET Web API Controller

У меня есть проект ASP.NET Web API с ApiController, который предоставляет конечную точку User со следующими действиями:

GET /api/User
POST /api/User
DELETE /api/user

Я хочу предоставить следующую конечную точку:

GET /api/user/metrics

Однако, когда я определяю действие контроллера следующим образом:

[HttpGet]
public HttpResponseMessage Metrics()
{
    return null;
}

Я получаю сообщение об ошибке Multiple actions were found that match the request.

Я понимаю, что это нарушает определение "чистого" REST API, но я хотел бы это сделать. Я предполагаю, что я должен решить эту проблему, сопоставляя HTTP-маршрут, но я пробовал несколько маршрутов, и я не могу заставить его работать. Каким должен быть мой маршрут?

4b9b3361

Ответ 1

Маршрут по умолчанию не включает действие.

routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

Он выбирает действия на основе контроллера, HTTP-глагола и параметра или отсутствия параметра на маршруте. Таким образом, он находит правильный контроллер и ищет действие GET без параметров. Он находит два.

Вы должны добавить дополнительный маршрут, который включает действие. Это делается либо с помощью маршрутизации, основанной на атрибутах, как упоминается Kiran, либо на основе маршрутизации на основе соглашения. Для маршрутизации на основе протокола маршрут обычно помещается в метод Application_start() WebApiConfig.cs. Более конкретные маршруты идут до общих маршрутов, поэтому ваши маршруты будут выглядеть примерно так:

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

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

Ответ 2

Если вы используете Web API 2, я бы предложил использовать маршрутизацию атрибутов, что упростит работу для таких сценариев.

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

В следующем примере показан аналогичный сценарий:

http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/WebApiAttributeRoutingSample/WebApiAttributeRoutingSample/Controllers/Api/CustomersController.cs