Запрошенный ресурс не поддерживает HTTP-метод GET

103

Мой маршрут настроен правильно, а мои методы имеют украшенный тег. Я по-прежнему получаю сообщение «Запрошенный ресурс не поддерживает HTTP-метод GET»?

[System.Web.Mvc.AcceptVerbs("GET", "POST")]
[System.Web.Mvc.HttpGet]
public string Auth(string username, string password)
{
  // Décoder les paramètres reçue.
  string decodedUsername = username.DecodeFromBase64();
  string decodedPassword = password.DecodeFromBase64();

  return "value";
}

Вот мои маршруты:

config.Routes.MapHttpRoute(
    name: "AuthentificateRoute",
    routeTemplate: "api/game/authentificate;{username};{password}",
    defaults: new { controller = "Game",
                    action = "Auth", 
                    username = RouteParameter.Optional, 
                    password = RouteParameter.Optional },
    constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }
);

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { controller = "Home", id = RouteParameter.Optional }
);
Рушино
источник

Ответы:

227

Используйте атрибуты из System.Web. Пространство имен Http в ваших действиях WebAPI:

    [System.Web.Http.AcceptVerbs("GET", "POST")]
    [System.Web.Http.HttpGet]
    public string Auth(string username, string password)
    {...}

Причина, по которой это не работает, заключается в том, что вы использовали атрибуты из пространства имен MVCSystem.Web.Mvc . Классы в System.Web.Httpпространстве имен предназначены для WebAPI .

Мэгги Инь
источник
11
Блин .. спасибо! Я собирался сойти с ума, лол, невероятно, как можно тратить время на такие мелочи ..
Рушино
1
Действительно, объяснение того, почему это правильный ответ, здесь, безусловно, необходимо!
Jaxidian
6
Отредактированный ответ с пояснением.
Maggie Ying
2
могу ли я указать [System.Web.Http.AcceptVerbs ("GET", "POST")] и [System.Web.Http.HttpGet] в RouteConfig.cs, чтобы мне не нужно было добавлять это в каждый API.
Гириш Гупта
8
Почему мне нужно было сделать это только в одном из моих 10 API для этого проекта? Я создал api точно так же, как и в других 9 api. Какое разочарование.
Дэн Болье
3

просто используйте этот атрибут

[System.Web.Http.HttpGet]

не нужна эта строка кода:

[System.Web.Http.AcceptVerbs("GET", "POST")]
Кашиф Фараз
источник
3

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

[Route("Documents/{id}")]   <--- caused the webapi error
[Route("Documents/{documentId}")] <-- solved
public Document Get(string documentId)
{
  ..
}
Армандо Сервин
источник
благослови вас :) +1
Шай Коэн
2

У меня была та же проблема ... У меня уже было 4 контроллера, которые работают и работают нормально, но когда я добавил этот, он вернул: «Запрошенный ресурс не поддерживает HTTP-метод 'GET'». Я пробовал все здесь и в паре других соответствующих статей, но был безразличен к решению, поскольку, как сказал Дэн Б. в ответ на ответ, у меня уже были другие, работающие нормально.

Я ушел на некоторое время, вернулся и сразу понял, что когда я добавил Контроллер, он был вложен в класс «Контроллер», а не в класс «ApiController», под которым находились другие мои Контроллеры. Я предполагаю, что выбрал неправильный вариант построения шаблонов для создания файла .cs в Visual Studio. Поэтому я включил пространство имен System.Web.Http, изменил родительский класс, и все работает без дополнительных атрибутов или маршрутизации.

Кэмерон
источник
0

Решил эту проблему, используя http(s)при доступе к конечной точке. Маршрут, по которому я выходил, был недоступен http. Поэтому я бы сказал, проверьте протоколы, для которых доступен маршрут.

Маркиз103
источник