web-dev-qa-db-fra.com

Asp.net WebApi: aucun type correspondant au contrôleur nommé 'xxxx' n'a été trouvé

J'ai ce problème qui semble assez commun, mais aucune des solutions que j'ai lues n'a fonctionné dans mon cas. J'essaie d'ajouter un ApiController dans un projet MVC existant.

Lorsque j'essaie d'accéder au contrôleur ajouté sur http: // localhost: 51362/api/test , le message d'erreur suivant s'affiche: {"Message":"No HTTP resource was found that matches the request URI 'http://localhost:51362/api/test'.","MessageDetail":"No type was found that matches the controller named 'test'."}

Mon projet contient les packages NuGet suivants:

  • Microsoft.AspNet.Mvc 5.2.3
  • Microsoft.AspNet.WebApi 5.2.3
  • Microsoft.AspNet.WebApi.Client 5.2.3
  • Microsoft.AspNet.WebApi.Core 5.2.3
  • Microsoft.AspNet.WebApi.WebHost 5.2.3

Mon Global.asax.cs (extrait):

RouteTable.Routes.Clear();
GlobalConfiguration.Configure(WebApiConfig.Register);
RouteTable.Routes.MapMvcAttributeRoutes();
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);

Mon WebApiConfig.cs:

using System.Web.Http;

namespace End.Web
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);

            // Web API routes
            config.MapHttpAttributeRoutes();

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

Mon nouveau contrôleur:

using System.Web.Http;

namespace End.Web.Controllers
{
    public class TestController : ApiController
    {
        public string Get()
        {
            return "ok";
        }
    }
}

J'ai également essayé le routage d'attributs sans succès. Ce que je veux faire semble très simple. Est-ce que je manque quelque chose d'évident?

6
youen

Je sais que c'est un vieux problème, mais comme il n'a jamais eu de réponse acceptée, je vais tenter le coup.

J'ai eu ce problème précis aussi. Pour moi, cela a résolu le problème:

GlobalConfiguration.Configure(config =>
{
    config.Services.Replace(typeof(IHttpControllerTypeResolver), new DefaultHttpControllerTypeResolver());
    ...
});

Dans mon cas, WebHostHttpControllerTypeResolver a été utilisé à la place de DefaultHttpControllerTypeResolver. WebHostHttpControllerTypeResolver lit d'abord les types de contrôleur à partir d'un cache (un fichier), et si ce fichier existe, son contenu est sérialisé et renvoyé. Si le fichier n'existe pas, WebHostHttpControllerTypeResolver appelle plutôt DefaultHttpControllerTypeResolver.

J'ai eu le problème en configurant d'abord l'API Web, mais sans contrôleur API. Cela a abouti à une liste cachée de types de contrôleurs, d’où le problème. Étant donné que les types de contrôleur sont mis en cache dans un fichier, son contenu ne sera pas supprimé même si vous redémarrez votre API Web.

Une autre solution pourrait consister à supprimer le fichier contenant la liste des types de contrôleurs en cache. Le fichier s'appelle MS-ApiControllerTypeCache.xml et doit figurer quelque part dans le dossier C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root.

WebHostHttpControllerTypeResolver.cs

2