На контроллере не найдено никаких действий, которые соответствуют запросу
Пожалуйста, извините мое невежество в этой области. Я прочитал много веток и до сих пор не могу правильно настроить маршрут.
У меня есть такой 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'.
Я выдернул волосы и не могу понять, каким должен быть правильный маршрут.
Любой добрый человек хотел бы помочь мне?
Ответы
Ответ 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);
Прекрасно работает для меня.