web-dev-qa-db-fra.com

Erreur 404 après l'ajout de l'API Web à une application Web MVC existante

Il y a une bonne question ici: Comment ajouter une API Web à un projet d'application Web ASP.NET MVC 4 existant?

Malheureusement, cela ne suffisait pas pour résoudre mon problème. J'ai essayé deux fois pour être sûr de n'avoir rien fait de mal. J'ai cliqué avec le bouton droit de la souris sur "Contrôleurs" et ajouté l'élément "Contrôleur Web API 2 avec actions, à l'aide d'Entity Framework" où j'ai sélectionné ma classe de modèle et mon contexte de base de données. Tout s'est bien passé ... mais quand même ... chaque fois que j'ai essayé d'accéder à/api/Rest, je recevais une erreur 404 (le nom de mon contrôleur est RestController).

60
Luis Gouveia

Ça marche!!! Je ne voulais pas y croire, mais devinez quoi, le problème était lié au routage Global.asax ordre.

Bien que cela ne fonctionne pas avec:

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

Cela fonctionne avec:

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

Fou, je sais.

118
Luis Gouveia

Si vous souhaitez utiliser WebAPI dans un projet MVC (5) existant, procédez comme suit:
1.Ajouter les packages WebApi:

Microsoft.AspNet.WebApi
Microsoft.AspNet.WebApi.Client
Microsoft.AspNet.WebApi.Core
Microsoft.AspNet.WebApi.WebHost
Newtonsoft.Json

2.Ajouter le fichier WebApiConfig.cs Dans le dossier App_Start:

using System.Web.Http;

namespace WebApiTest
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

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

.Ajouter la ligne suivante à Glabal.asax:

GlobalConfiguration.Configure(WebApiConfig.Register);

Note importante: vous devez ajouter la ligne ci-dessus exactement après AreaRegistration.RegisterAllAreas();

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

"Lors de l'ajout de nouvelles routes, gardez TOUJOURS À L'ESPRIT que vous devez ajouter une route spécifique en haut suivie par une route plus générique à la fin. Sinon, votre application Web ne recevra jamais un routage approprié."

Ce qui précède est la citation d’ici: http://www.codeproject.com/Tips/771809/Understanding-the-Routing-Framework-in-ASP-NET-MVC

Je sais que la réponse est déjà donnée, mais cela pourrait aider à comprendre pourquoi nous devons mettre GlobalConfiguration.Configure (WebApiConfig.Register); avant RouteConfig.RegisterRoutes (RouteTable.Routes);

2
Sergey