web-dev-qa-db-fra.com

Aucun type correspondant au contrôleur nommé "Utilisateur" n'a été trouvé.

J'essaie d'accéder à une page dont l'URL est au format suivant: Localhost: xxxxx/Utilisateur/{id}/VerifyEmail? SecretKey = xxxxxxxxxxxxxxx

J'ai ajouté une nouvelle route dans le fichier RouteConfig.cs et mon RouteConfig.cs ressemble à ceci:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "VerifyEmail",
            url: "User/{id}/VerifyEmail",
            defaults: new { controller = "User", action = "VerifyEmail" }
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index",
                id = UrlParameter.Optional }
        );
    }
}

Malheureusement, lorsque j'essaie de naviguer vers cette URL, la page suivante s'affiche:

<Error>
    <Message>
        No HTTP resource was found that matches the request URI 'http://localhost:52684/User/f2acc4d0-2e03-4d72-99b6-9b9b85bd661a/VerifyEmail?secretKey=e9bf3924-681c-4afc-a8b0-3fd58eba93fe'.
    </Message>
    <MessageDetail>
        No type was found that matches the controller named 'User'.
    </MessageDetail>
</Error>

et voici mon UserController:

public class UserController : Controller
{

    // GET      /User/{id}/VerifyEmail
    [HttpGet]
    public ActionResult VerifyEmail(string id, string secretKey)
    {
        try
        {
            User user = UsersBL.Instance.Verify(id, secretKey);
            //logger.Debug(String.Format("User %s just signed-in in by email.",
                user.DebugDescription()));
        }
        catch (Exception e)
        {
            throw new Exception("Failed", e);
        }
        return View();
    }
}

S'il vous plaît dites-moi ce que je fais mal?

45
elad

Dans mon cas, après avoir passé presque 30 minutes à essayer de résoudre le problème, j'ai trouvé la cause:

Mon itinéraire défini dans WebApiConfig.cs était comme ceci:

config.Routes.MapHttpRoute(
    name: "ControllersApi",
    routeTemplate: "{controller}/{action}"
);

et ça devrait être comme ça:

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

comme vous le voyez, cela interférait avec la route standard définie dans RouteConfig.cs.

41
Leniel Maccaferri

Dans mon cas, le contrôleur a été défini comme suit:

    public class DocumentAPI : ApiController
    {
    }

Le changer pour le suivant a fonctionné!

    public class DocumentAPIController : ApiController
    {
    }

Le nom de la classe doit se terminer par Manette!

Edit: Comme @Corey Alix l’a suggéré, assurez-vous que le contrôleur dispose du modificateur public access Les contrôleurs non publics sont ignorés par le gestionnaire d'itinéraire!

55
Raghu

Une autre solution pourrait être de définir l’autorisation de la classe controllers sur public.

définir ceci:

class DocumentAPIController : ApiController
{
}

à:

public class DocumentAPIController : ApiController
{
}
18
ElRaph

Dans mon cas, j'utilisais l'API Web et je n'avais pas défini public pour ma classe de contrôleur.

Choses à vérifier pour l'API Web:

  • La classe de contrôleur est déclarée en tant que public
  • La classe de contrôleur implémente ApiController : ApiController
  • Le nom de la classe de contrôleur doit se terminer par Controller
  • Vérifiez que votre URL a le préfixe /api/. par exemple. 'Hôte: port/api/{contrôleur}/{actionMethod}'
15
Zapnologica

Dans mon cas, je voulais créer un contrôleur API Web, mais, à cause de l'inattention, mon contrôleur a été hérité de Controller au lieu d'ApiController.

6
Sergey_T

Dans mon cas, le routage a été défini comme suit:

 config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "{*catchall}",
            defaults: new { controller = "WarehouseController" }

while Controller doit être abandonné dans la configuration:

 config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "{*catchall}",
            defaults: new { controller = "Warehouse" }
3
Juliusz

Dans mon cas, je voyais cela parce que j'avais deux contrôleurs du même nom:

L'un pour le traitement des commandes client appelé CustomersController et l'autre pour l'obtention d'événements également appelé CustomersController

J'avais raté la duplication, j'ai renommé les événements l'un en CustomerEventsController et cela a parfaitement fonctionné

3
RobertH

J'ai également rencontré le même problème. J'ai beaucoup cherché et découvert que l'autorisation au niveau de la classe était nécessaire. Par défaut, le niveau d'autorisation de la classe est interne, j'ai donc pensé que cela n'affecterait pas l'exécution du programme. Mais cela a été affecté, vous devriez donner à votre classe l'autorisation publique afin que vous ne rencontriez aucun problème. 

Et un de plus. s'il s'agit d'un projet webapi, votre fichier webapirouteconfig écrasera les paramètres du fichier routeconfig.cs. Mettez donc à jour le fichier webapi routeconfig pour qu'il fonctionne correctement.

1
Gopi P

Expérimenté ce problème similaire. Nous avons affaire à plusieurs API et nous avons trouvé le mauvais numéro de port et obtenu cette erreur. Nous a pris pour toujours à réaliser. Assurez-vous que le port de l'API que vous frappez est le bon port.

1
Erkin Djindjiev

Dans ma solution, j'ai un projet appelé "P420" et dans un autre projet, j'avais un contrôleur P420.

Lorsque .NET coupe le nom du contrôleur pour rechercher la route, conflit avec un autre projet, utilisé comme bibliothèque dans.

J'espère que ça aide.

1
Andre Mesquita

Face au même problème. Vérifié toutes les réponses ici mais mon problème était dans namespacing . Les attributs de routage existent dans System.Web.Mvc et dans System.Web.Http Mes utilisations incluaient l'espace de noms MVC et c'était la raison. Pour webapi, vous devez utiliser System.Net.Http .

0
Leonid Ershov

Dans ma solution, lorsque j'ai ajouté le nouveau contrôleur au projet, l'assistant m'a demandé si je souhaitais définir l'emplacement du contrôleur dans le dossier App_Code . L'assistant m'a averti si je ne le localisais pas dans le Dans le dossier App_Code, le type de contrôleur ne sera pas trouvé. Mais je n'ai pas lu l'intégralité de l'avertissement, car je voulais localiser le fichier ailleurs ... donc c'est pourquoi il n'a pas fonctionné.

Après avoir ajouté un nouveau contrôleur et l'avoir laissé dans App_Code par défaut, tout a fonctionné.

0
Bene

Dans mon cas, j'appelais l'API comme

http: // locahost: 56159/api/loginDataController/GetLoginData

alors que cela devrait être comme 

http: // locahost: 56159/api/loginData/GetLoginData

supprime Controller de l'URL et cela commence à fonctionner ...

Paix!

0
Azhar