Ich habe mit mvc4 Visual Studio 2012 mit .net Framework 4.5 installiert. Jetzt möchte ich webapi2 mit Attributschreiben verwenden und ich möchte, dass meine hlep-Seite alle Endpunkte richtig anzeigt.
In meiner Lösung habe ich ein neues mvc4-basiertes emtpy-Projekt hinzugefügt und mit nuget ein Upgrade auf mvc5 durchgeführt und anschließend webapi2-Pakete installiert. Zuletzt habe ich das Hilfepaket für webapi2 installiert.
wenn ich jetzt routeprefix verwende, kann ich keinen Inhalt auf der Hilfeseite sehen und wenn ich versuche, auf meinen webapi-Endpunkt in Browsern zuzugreifen, wird folgender Fehler ausgegeben.
<Error>
<Message>
No HTTP resource was found that matches the request URI 'http://expressiis.com/api/v1/'.
</Message>
<MessageDetail>
No type was found that matches the controller named 'v1'.
</MessageDetail>
</Error>
namespace WebApi.Controllers
{
[RoutePrefix("api/v1")]
public class SubscribersController : ApiController
{
// GET api/<controller>
[Route("")]
[HttpGet]
public IQueryable<string> Get()
{
return new string[] { "value1", "value2" }.AsQueryable();
}
}
}
Basierend auf Ihren Informationen sieht es so aus, als würden Sie nicht die httpConfig.MapHttpAttributeRoutes()
anrufen (stellen Sie sicher, dass Sie diese vor herkömmlichen Routing-Registrierungen aufrufen)
Da Sie MapHttpAttributeRoutes nicht aufgerufen haben, scheint Ihre Anfrage einer herkömmlichen Route zu entsprechen, z. B. api/{controller}
. Dies funktioniert nicht, da für Routen, die mit herkömmlichen Routen übereinstimmen, niemals Controller/Aktionen mit Attributrouten angezeigt werden.
Ein Problem, auf das ich gestoßen bin, war mit der Bestellung in Application_Start () verbunden. Beachten Sie die Reihenfolge der Web-API-Konfiguration unten:
Das funktioniert nicht
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
GlobalConfiguration.Configure(WebApiConfig.Register);
}
Das funktioniert doch
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
Ich hatte auch dieses Problem und nach einer langen Suche wurde mir klar, dass ich System.Web.Mvc.RouteAttribute
anstelle von System.Web.Http.RouteAttribute
.__ verwendete. Nachdem ich dies korrigiert hatte und config.MapHttpAttributeRoutes() everything worked fine.
verwendete
Dies war nicht Ihr Fall (wie aus Ihrem Beispielcode hervorgeht). Denken Sie jedoch daran, den Namen der Controller-Klasse mit Controller
zu beenden.
Sonst wird es nicht von config.MapHttpAttributeRoutes();
abgeholt.
Diese Frage hat bereits eine ausgewählte Antwort. Ich hatte jedoch eine andere Lösung für mich und denke, es wäre hilfreich zu antworten, wenn die ausgewählte Antwort nicht hilft.
Für mich war das ein dummer Fehler. Ich hatte zwei Controller, aber nur einer funktionierte. Die Lösung war, dass meine Controller-Klasse falsch benannt wurde!
Mein arbeitender Controller-
public class FooController : ApiController { }
Mein nicht funktionierender Controller-
public class BarControllers : ApiController { }
Stellen Sie sicher, dass Ihre Controller-Klasse mit Controller
endet. Der nachfolgende s
hat mich erwischt!
In meinem Fall erstellt VS meinen Controller mit dem Namen
TestController1
Ich weiß nicht, warum er diese Zahl "eins" am Ende des Namens gesetzt hat, aber entferne und werde funktionieren.
Stellen Sie sicher, dass Sie nicht zwei Controller mit demselben Namen haben! Ich habe einige Controller von einer Assembly verschoben, die ich in die Website geworfen hatte ... während die Website keine Verweise auf die alte Assembly hatte, die andere Assemblys verwendeten, was bedeutete, dass sie in den WebSite-Ordner "Bin" kopiert wurde. Der Routenerkennungsprozess schien dann lautlos zu scheitern, als er auf zwei Vorkommen des gleichen Controllers stieß!