web-dev-qa-db-ger.com

das asp.net webapi 2-Attribut-Routing funktioniert nicht

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.

http://expressiis.com/api/v1/

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


    }
}
31
najam

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.

48
Kiran Challa

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);
}
33
Josh C

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

15
FrenchKevin777

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.

9
user3638471

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!

4
micah

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. 

0
Paulo

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ß!

0
Phil