Aucun type correspondant au contrôleur nommé 'User'n'a été trouvé

j'essaie de naviguer vers une page dont L'URL est dans le format suivant: localhost:xxxxx/Utilisateurs/{id}/VerifyEmail?secretKey=xxxxxxxxxxxxxxx

j'ai ajouté une nouvelle route dans le RouteConfig.cs le fichier et donc 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, en essayant de naviguer à cette URL Je reçois cette page:

<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?

41
demandé sur Shimmy 2013-07-23 17:09:30

11 réponses

dans mon cas, après avoir passé près de 30 minutes à essayer de résoudre le problème, j'ai trouvé ce qui le causait:

Ma route définie dans WebApiConfig.cs comme ceci:

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

et il devrait ressembler à ceci:

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

comme vous le voyez il interférait avec le standard de route définie dans RouteConfig.cs.

40
répondu Leniel Maccaferri 2015-10-30 05:16:53

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

    public class DocumentAPI : ApiController
    {
    }

le changer en ce qui suit a fonctionné!

    public class DocumentAPIController : ApiController
    {
    }

le nom de la classe doit se terminer par Controller!

49
répondu Raghu 2016-02-03 15:12:38

une autre solution pourrait être de mettre la permission de classe controllers au public.

mettez ceci:

class DocumentAPIController : ApiController
{
}

à:

public class DocumentAPIController : ApiController
{
}
13
répondu ElRaph 2016-10-07 16:23:58

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

choses à vérifier pour L'API Web:

  • la classe Controller est déclarée comme public
  • la classe Controller implémente ApiController : ApiController
  • le nom de la classe du contrôleur doit se terminer par Controller
  • Vérifiez que votre url est /api/ préfixe. par exemple. 'host: port / api / {controller} / {actionMethod}'
13
répondu Zapnologica 2017-07-26 08:56:50

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

5
répondu Sergey_T 2016-10-05 13:55:39

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

un pour traiter les commandes des clients appelé CustomersController et l'autre pour récupérer les évènements aussi appelé CustomersController

j'avais raté la duplication, j'ai renommé les événements un à CustomerEventsController et il a parfaitement fonctionné

3
répondu RobertH 2017-01-13 16:10:24

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

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

Controller doit être placé dans la config:

 config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "{*catchall}",
            defaults: new { controller = "Warehouse" }
2
répondu Juliusz 2016-09-09 09:50:26

ont connu ce problème similaire. Nous avons affaire à plusieurs API et nous avons frappé le mauvais numéro de port et d'obtenir cette erreur. Nous a fallu une éternité pour le réaliser. Assurez-vous que le port de l'api, vous sont frapper est le bon port.

1
répondu Erkin Djindjiev 2016-12-01 23:09:26

j'ai aussi fait face au même problème. J'ai beaucoup cherché et j'ai trouvé que la permission de la classe est nécessaire. par défaut, la classe niveau d'autorisation est interne, donc j'ai pensé qu'il n'affecte pas l'exécution du programme. Mais il a été affecté en fait, vous devriez donner votre permission de classe en tant que public de sorte que, vous ne serez pas confrontés à un problème.

Et un de plus. si c'est un projet webapi, votre fichier webapirouteconfig écrasera la routeconfig.paramètres du fichier cs. Ainsi mettre à jour le webapi routeconfig fichier ainsi pour fonctionner correctement.

1
répondu Gopi P 2017-12-07 07:37:54

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

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

j'Espère que ça aide.

1
répondu Andre Mesquita 2018-08-10 16:26:35

Dans ma solution, quand j'ai ajouté mon nouveau Contrôleur pour le projet, l'assistant m'a demandé si je veux définir l'emplacement du contrôleur dans le dossier App_Code. L'assistant m'a prévenu, si je ne le placez pas dans le dossier App_Code, le type de contrôleur ne sera pas trouvé. Mais je n'ai pas lu tout l'avertissement, parce que je voulais trouver le dossier ailleurs.. c'est pour ça que ça n'a pas marché pour moi.

après que j'ai ajouté un nouveau controller et le laisser ÊTRE dans L'App_Code par défaut, tout a fonctionné.

0
répondu Bene 2018-09-04 07:49:22