wake-up-neo.net

Asp.net WebApi: Es wurde kein Typ gefunden, der mit dem Controller 'xxxx' übereinstimmt.

Ich habe dieses Problem, das ziemlich häufig erscheint, aber keine der Lösungen, über die ich gelesen habe, funktionierte in meinem Fall. Ich versuche, einen ApiController in ein vorhandenes MVC-Projekt einzufügen.

Wenn ich versuche, auf den hinzugefügten Controller unter http: // localhost: 51362/api/test zuzugreifen, erhalte ich diesen Fehler: {"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'."}

Mein Projekt enthält die folgenden NuGet-Pakete:

  • 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

Meine Global.asax.cs (Auszug):

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

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

Mein neuer Controller:

using System.Web.Http;

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

Ich habe auch Attribut-Routing ohne Erfolg versucht. Was ich machen möchte, scheint sehr einfach zu sein. Fehlt mir etwas offensichtliches?

6
youen

Ich weiß, dass dies ein altes Problem ist, aber da es nie eine akzeptierte Antwort bekam, werde ich es versuchen.

Ich hatte genau diese Frage. Für mich wurde das Problem gelöst:

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

In meinem Fall wurde WebHostHttpControllerTypeResolver anstelle von DefaultHttpControllerTypeResolver verwendet. WebHostHttpControllerTypeResolver liest Controller-Typen zuerst aus einem Cache (einer Datei). Wenn diese Datei vorhanden ist, wird der Inhalt serialisiert und zurückgegeben. Wenn die Datei nicht vorhanden ist, ruft WebHostHttpControllerTypeResolver stattdessen DefaultHttpControllerTypeResolver auf.

Ich habe das Problem bekommen, indem ich zuerst die Web-API eingerichtet habe, aber keine API-Controller hatte. Dies führte zu einer zwischengespeicherten leeren Liste von Controller-Typen, daher das Problem. Da die Controller-Typen in einer Datei zwischengespeichert werden, wird der Inhalt nicht gelöscht, obwohl Sie Ihre Web-API neu starten.

Eine andere Lösung könnte darin bestehen, die Datei zu entfernen, in der die zwischengespeicherte Liste der Controller-Typen gespeichert ist. Die Datei heißt MS-ApiControllerTypeCache.xml und sollte sich irgendwo im Ordner C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root befinden.

WebHostHttpControllerTypeResolver.cs