web-dev-qa-db-fra.com

asp.net webapi 2 routage par attributs ne fonctionne pas

J'ai Visual Studio 2012 installé avec mvc4 à l'aide de .net Framework 4.5. Maintenant, je veux utiliser webapi2 avec l'écriture d'attribut et je veux que ma page hlep affiche correctement tous les points de terminaison.

Dans ma solution, j'ai ajouté un nouveau projet de base mvc4 et utilisant Nuget, j'ai mis à niveau vers mvc5, puis j'ai installé les paquets webapi2. enfin, j'ai installé le paquet d'aide pour webapi2.

maintenant, lorsque j'utilise routeprefix, je ne peux voir aucun contenu sur la page d'aide et lorsque j'essaie d'accéder à mon terminal Webapi dans les navigateurs, l'erreur suivante est générée.

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

D'après vos informations, il semble que vous n'appeliez pas la httpConfig.MapHttpAttributeRoutes() (assurez-vous d'appeler ce avant tous les enregistrements de routage traditionnels)

Comme vous n'avez pas encore appelé MapHttpAttributeRoutes, votre demande semble correspondre à un itinéraire traditionnel, par exemple api/{controller}. Cela ne fonctionnera pas car les itinéraires correspondant aux itinéraires traditionnels ne verront jamais les contrôleurs/actions décorés avec des itinéraires d'attributs.

46
Kiran Challa

Un problème que j'ai rencontré était lié à la commande dans Application_Start (). Notez l'ordre de configuration de l'API Web ci-dessous:

Cela ne fonctionne pas

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
    GlobalConfiguration.Configure(WebApiConfig.Register);
}

Ça marche 

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

J'ai eu ce problème aussi et après une longue recherche, j'ai réalisé que j'utilisais System.Web.Mvc.RouteAttribute au lieu de System.Web.Http.RouteAttribute Après avoir corrigé cela et utilisé config.MapHttpAttributeRoutes() everything worked fine.

15
FrenchKevin777

Ce n'était pas votre cas (comme le montre votre exemple de code), mais n'oubliez pas de terminer le nom de la classe Controller par Controller.

Sinon, il ne sera pas récupéré par config.MapHttpAttributeRoutes();.

9
user3638471

Cette question a déjà une réponse sélectionnée. Mais j'avais une solution différente pour moi et je pense qu'il serait utile de répondre si la réponse choisie n'aide pas.

Pour moi, c'était une erreur stupide. J'avais deux contrôleurs mais un seul fonctionnait. La solution était que ma classe de contrôleurs avait été mal nommée!

Mon contrôleur de travail-

public class FooController : ApiController { }

Mon contrôleur en panne-

public class BarControllers : ApiController { }

Assurez-vous que votre classe de contrôleur se termine par Controller. Le s de fuite m'a eu!

4
micah

Dans mon cas, VS crée mon contrôleur avec le nom 

TestController1

Je ne sais pas pourquoi il a mis ce numéro "un" à la fin du nom, mais le supprime et fonctionne. 

0
Paulo

Assurez-vous de ne pas avoir deux contrôleurs avec le même nom! J'étais en train de déplacer des contrôleurs d'une assemblée que je jetais dans le site Web ... alors que le site Web ne contenait plus de références à l'ancienne assemblée, ce qui signifiait qu'elle était copiée dans le dossier WebSite bin. Le processus de découverte d'itinéraire semblait alors échouer en silence lorsqu'il a rencontré deux occurrences du même contrôleur!

0
Phil