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

На контроллере не найдено никаких действий, которые соответствуют запросу

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

У меня есть такой ProductsController:

public class ProductsController : ApiController
{
    [ActionName("GetListOfStudents")]
    public static List<Structures.StudentInfo> GetListOfStudents(string Username, string Password)
    {
        List<Structures.StudentInfo> si = StudentFunctions.GetListOfStudents(Username, Password);
        return si;
    }
}

У меня есть консольная тестовая программа, в которой я определил маршрут:

config.Routes.MapHttpRoute(
name: "ApiByAction",
routeTemplate: "api/products/GetListOfStudents",
defaults: new { controller = "products", action = "GetListOfStudents" });

Но когда я бегу, звоните

GET http://localhost:8080/api/Products/GetListOfStudents

Я получаю сообщение об ошибке:

MessageDetail=No action was found on the controller 'Products' that matches the name 'GetListOfStudents'.

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

Любой добрый человек хотел бы помочь мне?

4b9b3361

Ответ 1

Хорошо спасибо за помощь!

Это то, что я сделал, чтобы заставить его работать:

  • Удалено "статическое" из функции GetListOfStudents.
  • Добавлен маршрут ниже.
config.Routes.MapHttpRoute(
  name: "ApiByAction",
  routeTemplate: "api/products/GetListOfStudents/{username}/{password}",
  defaults: new { controller = "products", action = "GetListOfStudents" }
);

Спасибо всем за вашу помощь!

Ответ 2

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

config.Routes.MapHttpRoute(
name: "ApiByAction",
routeTemplate: "api/{controller}/{action}
defaults: new { controller = "products", action = "GetListOfStudents" });

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

config.Routes.MapHttpRoute(
name: "ApiByAction",
routeTemplate: "api/{controller}/{action}

Это должно выполнить задание:)

Ответ 3

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

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

Ответ 4

Наиболее важным является: ASP.Net mvc не только ищет действия по имени, но и проверяет подпись метода, только метод нестатичен, совпадения имен и параметров соответствуют, действие будет выполнено.

для вашего случая есть два способа исправить это. один из способов - объявить значение по умолчанию, mvc будет использовать значение по умолчанию, когда параметр не найден.

public List<Structures.StudentInfo> GetListOfStudents(string Username = null, string Password = null)
{
    List<Structures.StudentInfo> si = StudentFunctions.GetListOfStudents(Username, Password);
    return si;
}

второй способ - использовать переопределение

public List<Structures.StudentInfo> GetListOfStudents()
{
   return GetListOfStudents(null, null);
}

public List<Structures.StudentInfo> GetListOfStudents(string Username, string Password)
{
    List<Structures.StudentInfo> si = StudentFunctions.GetListOfStudents(Username, Password);
    return si;
}

Ответ 5

У меня была эта проблема и она была решена, включив глагол в качестве части действия (т.е. GetThis, GetThat) и вручную создавая маршруты. Я пытался создавать маршруты с использованием атрибутов, но это не сработало. Этот вопрос SO > может быть ответом на то, почему атрибуты не работают, я еще не получил это исправление. В качестве дополнительной заметки для всех, у кого есть такая же проблема, при ее локальном отладке, IE рушился, когда был возвращен xml-запрос "no action found" . Как только я сдался и переключился на Chrome, деталь сообщения была возвращена, и было очевидно, что мой контроллер, по крайней мере, был найден, просто нужно было заставить действие работать...

Ответ 6

Если вы хотите вызвать метод GetListOfStudents без параметра, вы должны установить значение по умолчанию для параметра. такие как   GetListOfStudents (строка Username = null, строка Password = null) В противном случае вы должны вызвать метод с параметрами. GET http://localhost:8080/api/Products/GetListOfStudents/Username/Password

Ответ 7

Одной из проблем может быть порядок объявлений маршрутов в вашем файле WebApiConfig.cs. Посмотрите здесь о приоритетности маршрутов. Если у вас есть два маршрута с одинаковым количеством параметров, вам может потребоваться изменить порядок маршрутов или - в зависимости от того, насколько конкретным является маршрут - жестко указать имя контроллера или действия

Ответ 8

При отправке закодируйте пароль с помощью base64. Затем, когда вы собираетесь его использовать, декодируйте его.

byte[] numArray = Convert.FromBase64String(password);
string Pass = Encoding.UTF8.GetString(numArray); 

List<Structures.StudentInfo> si = StudentFunctions.GetListOfStudents(Username, Pass);

Прекрасно работает для меня.