HTTP 404 при вызове моего метода WebAPI

Я пытаюсь вызвать свой метод WebAPI, как определено ниже, с помощью fiddler, но получаю следующее исключение. Пожалуйста, дайте мне знать, что мне здесь не хватает, так как я не могу использовать определенный метод.

Прототип метода:

[Route("api/tournament/{tournamentId}/{matchId}/{teamId}/{userEmail}/PostMatchBet")]
public HttpResponseMessage PostMatchBet(int tournamentId, int matchId, int teamId, string userEmail)

Метод определен в контроллере Tournament WebAPI и пытается получить доступ к методу с HTTP-глаголом, установленным для публикации следующим образом:

http://localhost:59707/api/tournament/PostMatchBet?tournamentId=1&matchId=1&teamId=8&[email protected]

Пожалуйста, дайте мне знать, что мне здесь не хватает.

Сведения об исключении: «MessageDetail»: «На контроллере «Турнир» не найдено действие, соответствующее запросу».


person Manju    schedule 19.03.2017    source источник


Ответы (2)


Убедитесь, что конфигурация маршрута выполнена правильно.

public static class WebApiConfig 
    public static void Register(HttpConfiguration config) {
        // Attribute routing.
        config.MapHttpAttributeRoutes();

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

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

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

чтобы этот URL-адрес POST работал...

http://localhost:59707/api/tournament/PostMatchBet?tournamentId=1&matchId=1&teamId=8&[email protected]

он будет соответствовать основанному на соглашении шаблону маршрута, например

api/{controller}/{action}

сопоставляется с этим действием.

public class TournamentController : ApiController {
    [HttpPost]
    public HttpResponseMessage PostMatchBet(int tournamentId, int matchId, int teamId, string userEmail) { ... }
}

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

[RoutePrefix("api/tournament")]
public class TournamentController : ApiController {
    //POST api/tournament/postmatchbet{? matching query strings}
    [HttpPost]
    [Route("PostMatchBet")]
    public HttpResponseMessage PostMatchBet(int tournamentId, int matchId, int teamId, string userEmail) { ... }
}
person Nkosi    schedule 19.03.2017

В вашем пути URL

http://localhost:59707/api/tournament/PostMatchBet?tournamentId=1&matchId=1&teamId=8&[email protected]

[Route("api/tournament/{tournamentId}/{matchId}/{teamId}/{userEmail}/PostMatchBet")]

Как видите, вы должны закончить методом в соответствии с установленным вами маршрутом. Также вы говорите, что ожидаете разделения косой чертой, а не параметризованным URL-адресом, например. (?, &). Таким образом, он будет слушать его, если вы передадите что-то подобное.

http://localhost:59707/api/tournament/1/1/8/[email protected]/PostMatchBet
person Ricky Alexandersson    schedule 19.03.2017
comment
.com в URL-адресе может вызвать проблему, так как его можно ошибочно принять за расширение файла. - person Nkosi; 19.03.2017
comment
Однако я не понимаю, как это могло бы произойти, поскольку его интерпретация задается в маршруте в сочетании с вводом метода, который уже должен интерпретироваться как строка. Не могли бы вы уточнить? - person Ricky Alexandersson; 19.03.2017