web-dev-qa-db-fra.com

Aucune action n'a été trouvée sur le contrôleur qui correspond à la demande

S'il vous plaît excuser mon ignorance dans ce domaine. J'ai lu beaucoup de discussions et je ne parviens toujours pas à obtenir un routage correct.

J'ai un ProductsController comme ceci:

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;
    }
}

J'ai un programme de test de la console où j'ai défini l'itinéraire:

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

Mais quand je lance un appel

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

Je reçois le message d'erreur:

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

Je me suis arraché les cheveux et je ne peux pas déterminer le bon chemin.

Est-ce qu'une personne gentille voudrait m'aider?

13
Trevor Daniel

Ok merci pour l'aide peeps!

C'est ce que j'ai fait pour que cela fonctionne:

  1. Suppression de la "statique" de la fonction GetListOfStudents.
  2. Ajout de l'itinéraire ci-dessous.
config.Routes.MapHttpRoute(
  name: "ApiByAction",
  routeTemplate: "api/products/GetListOfStudents/{username}/{password}",
  defaults: new { controller = "products", action = "GetListOfStudents" }
);

Merci à tous pour votre aide!

12
Trevor Daniel

Lorsque vous enregistrez votre point d'accès global à l'API, vous devez indiquer à la configuration le chemin à utiliser de la manière suivante:

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

Dans cet exemple, vous indiquez explicitement au contrôleur qu'il doit uniquement accéder au contrôleur "produits". Vous pouvez le rendre générique sans spécifier le contrôle ou l'action. 

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

Cela devrait faire le travail :)

11
Yuval Itzchakov

Votre action GetListOfStudents nécessite deux paramètres, nom d'utilisateur et mot de passe. Pourtant, la définition de route ne contient ni spécification dans le modèle de route d'où proviennent les valeurs de ces paramètres, ni spécification pour les paramètres par défaut de la définition de paramètre defaults:.

Ainsi, lorsque la requête arrive, le routage peut trouver votre contrôleur, mais il ne peut pas trouver l'action qu'il peut appeler avec la requête et le contexte de routage qu'il possède car il ne dispose pas d'informations pour les paramètres de nom d'utilisateur et de mot de passe.

6
LB2

Le plus important est: Le mvc d’ASP.Net recherche non seulement une action par son nom, mais vérifie également la signature de la méthode; seule la méthode est non-statique , correspond aux noms et correspond aux paramètres , l'action sera exécutée.

pour votre cas, il existe deux façons de la corriger .. Une méthode consiste à déclarer la valeur par défaut, mvc utilisera la valeur par défaut lorsque parametr est introuvable.

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

la deuxième façon est l'utilisation prioritaire

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;
}
3
dexiang

Si vous souhaitez appeler la méthode GetListOfStudents sans paramètre, vous devez définir la valeur par défaut pour paramètre. tel que GetListOfStudents (chaîne Nom d'utilisateur = null, chaîne Mot de passe = null) Sinon, vous devez appeler la méthode avec les paramètres . GET http: // localhost: 8080/api/Produits/GetListOfStudents/Nom d'utilisateur/Mot de passe

0

J'ai eu ce problème et je l'ai résolu en incluant le verbe dans l'action (c'est-à-dire GetThis, GetThat) et en créant manuellement des itinéraires. J'essayais de créer des itinéraires en utilisant des attributs, mais cela ne fonctionnait pas. Cette SO question est peut-être la réponse quant à la raison pour laquelle les attributs ne fonctionnent pas, je ne l’ai pas encore clarifiée. Comme remarque supplémentaire pour tous ceux qui ont le même problème, lors du débogage local, IE se bloquait lorsque le xml "aucune action trouvée" était renvoyé. Une fois que j'ai abandonné l'application et que je suis passé à Chrome, les détails du message ont été renvoyés et il était évident que ma manette était au moins en train d'être détectée.

0
jmoreno