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?
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
.
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!
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
{
}
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:
public
: ApiController
Controller
/api/
. par exemple. 'Hôte: port/api/{contrôleur}/{actionMethod}'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.
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" }
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é
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.
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.
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.
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 .
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é.
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!