web-dev-qa-db-fra.com

Erreur ASP.NET MVC WebAPI 404

J'ai une application de formulaires Web asp.net fonctionnant en mode intégré v4.0.

J'ai essayé d'ajouter un apicontroller dans le dossier App_Code. 

Dans le fichier Global.asax, j'ai ajouté le code suivant

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

Lorsque j'ai essayé de naviguer vers le contrôleur à http://localhost/api/Value, l'erreur 404 s'est produite.

L'URL sans extension est configuré dans la section handler. Les formulaires et l'authentification anonyme sont activés pour le site Web. 

L'extension url est configurée pour '*.'

Lorsque je tape l'URL du contrôleur, la demande est gérée par StaticHandler au lieu de ExtensionlessUrlHandler-Integrated-4.0. 

Je n'ai aucune idée maintenant pourquoi le système va jeter l'erreur comme indiqué dans l'image ci-dessous .Error

59
Suneel Dixit

J'éprouvais ce problème.

J'ai essayé de modifier mon WebApiConfig.cs pour répondre à un certain nombre de recommandations ici et à des exemples de code ailleurs. Certains fonctionnaient, mais cela n'expliquait pas pourquoi la route ne fonctionnait pas lorsque WebApiConfig.cs était codé exactement comme dans le projet MS WebApi.

Mon problème actuel était qu'en ajoutant manuellement WebApi à mon projet, je n'avais pas suivi l'ordre des appels de configuration de Global.asax.

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        // This is where it "should" be
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        // The WebApi routes cannot be initialized here.
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }

Je pourrais deviner pourquoi, mais je n'ai pas enquêté davantage. Ce n'était pas intuitif pour le moins.

107
shannon

Le problème réside dans votre configuration de routage. Le routage Mvc est différent du routage WebApi.

Ajoutez une référence à System.Web.Http.dll, System.Web.Http.Webhost.dll et System.Net.Http.dll, puis configurez votre routage d'API comme suit: 

   GlobalConfiguration.Configuration.Routes.MapHttpRoute(
     name: "DefaultApi",
     routeTemplate: "api/{controller}/{id}",
     defaults: new { id = System.Web.Http.RouteParameter.Optional }
   );
32
Alborz

Assurer les choses suivantes

1.) Assurez-vous que votre IIS est configuré avec .NET 4.5 ou 4.0 si votre API Web est 4.5, installez 4.5 dans IIS 

exécuter cette commande dans la commande Invite avec privilège d'administrateur

C:\Windows\Microsoft.NET\Framework\v4.0.30319>aspnet_regiis.exe -i

2.) Changez votre routage en 

RouteTable.Routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "{controller}/{id}",
      defaults: new { id = System.Web.Http.RouteParameter.Optional }
 );

et faire une demande avec Demo/Get (où démo est le nom de votre contrôleur)

si les 1,2 ne fonctionnent pas, essayez 3

3.) Ajouter la configuration suivante dans le fichier web.config

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />

</system.webServer>
16
Binson Eldhose

Assurez-vous également que votre contrôleur se termine par "Controller" comme dans "PizzaPieController".

9
Eric W.

J'ai essayé tout ce qui précède et j'ai eu le même problème. Il s'est avéré que le pool d'applications créé dans IIS était configuré par défaut sur .net 2.0. Quand je l'ai changé en 4.0, ça a encore fonctionné

7
Alan

Si vous créez le contrôleur dans App_Code, comment la table de routage sait-elle où elle se trouve? Vous avez spécifié l'itinéraire comme "api/{controller/..." mais ce n'est pas là que se trouve le contrôleur. Essayez de le déplacer dans le bon dossier.

2
crunchy

Merci Shannon, fonctionne très bien =>

Ma commande dans mon Global.asax était:

GlobalConfiguration.Configure(WebApiConfig.Register);  
RouteConfig.RegisterRoutes(RouteTable.Routes);

au lieu du bon: 

RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register); 
2
ceinpap

Après des heures passées sur ce sujet, j'ai trouvé la solution à ce problème dans mon cas.

C'était l'ordre d'enregistrement des routes dans RouteConfig

Nous devrions enregistrer HttpRoute dans la table Route avant la route du contrôleur par défaut. Ce devrait être comme suit. Configuration de la route Route Config Configuration

  public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.MapHttpRoute(
             name: "DefaultApi",
             routeTemplate: "api/{controller}/{action}/{id}",
             defaults: new { id = RouteParameter.Optional }
         );
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

    }
}
2
Shri Guru

Essayez également de supprimer tout le contenu du dossier de votre api bin. Le mien contenait d'anciennes DLL (en raison d'un grand nom d'espace), exposant les contrôleurs en conflit. Ces dll n'ont pas été supprimés par la fonctionnalité de nettoyage de Visual Studio.

(Cependant, je trouve que l'API Web asp.net manque sérieusement d'informations de routage et de débogage au niveau du débogage).

2
Simon Budin

Pour l'URL que vous essayez (http://localhost/api/Value), assurez-vous qu'il existe un type public nommé ValueController qui dérive de ApiController et qui possède une méthode publique présentant certaines des caractéristiques suivantes: 

  • Le nom de la méthode commence par Get (par exemple GetValues ou simplement Get).
  • Un attribut HttpGet est appliqué à la méthode.

Si vous essayez le code du modèle de projet API Web par défaut, le nom du contrôleur est ValuesController et non pas ValueController. L'URL sera donc http://localhost/api/values.

Si cela ne vous aide pas, vous voudrez peut-être activer le traçage , ce qui peut vous donner une idée utile de l'emplacement de l'erreur (ainsi que du pourquoi).

J'espère que cela t'aides.

1
volpav

J'ai copié une dll de contrôleur basée sur RouteAttribute dans le dossier bin, mais elle n'est pas reconnue comme un contrôleur valide et l'erreur 404 s'affiche sur le client.

Après beaucoup de débogage, j'ai trouvé mon problème. C'est parce que la version de System.Web.Http.dll que le contrôleur référençait était différente de la version de System.Web.Http.dll que le projet principal (celui contenant global.asax.cs) faisait référence à.

Asp.Net trouve le contrôleur par réflexion en utilisant un code comme celui-ci

internal static bool IsControllerType(Type t)
{
    return
        t != null &&
        t.IsClass &&
        t.IsVisible &&
        !t.IsAbstract &&
        typeof(IHttpController).IsAssignableFrom(t) &&
        HasValidControllerName(t);
}

Puisque IHttpController est différent pour chaque version de System.Web.Http.dll, le contrôleur et le projet principal doivent avoir la même référence.

1
tcb

Nous avions également ceci, changer la version .NET de la version 4.5 à la version 4.5.1 ou plus récente a résolu le problème. 

1
Eric Herlitz

Essayez simplement d’utiliser la partie Value du nom du contrôleur, comme ceci:

http://localhost/api/Value

Remarque: Par convention, le moteur de routage prendra une valeur passée en tant que nom de contrôleur et y ajoutera Word Controller. En mettant ValueController dans l'URI, le moteur de routage cherchait une classe nommée ValueControllerController qu'il n'a pas trouvée.

0
Karl Anderson

Il est temps pour moi d’ajouter à ma liste mon oubli ridicule: j’ai mal saisi le chemin de la route par défaut de mon webapi.

Original:

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

Corrigé: (observez les accolades autour de "id")

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

La configuration de votre itinéraire est bonne. Revérifiez la section des gestionnaires dans web.config. Pour le mode intégré, il s'agit de la manière appropriée d'utiliser ExtensionLessUrlHandler:

<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

Plus sur ce sujet: http://blogs.msdn.com/b/tmarq/archive/2010/05/26/how-extensionless-urls-are-handled-by-asp-net-v4.aspx

0
dbalogh

Dans mon cas, j'ai oublié de le faire dériver d'ApiController. 

Donc, cela ressemblerait à 

public class ValuesController : ApiController
0
aoakeson

Aucune des solutions ci-dessus n'a résolu mon problème ... Mon erreur est que j'ai copié les fichiers bin directement sur le serveur de production, puis que je ne travaille pas. La 404 avait disparu lorsque j'ai publié le projet sur disque et copié le dossier "publié" sur le serveur. C'est un peu évident, mais peut aider quelqu'un.

0
Tiago Gouvêa

J'apprécie cette question très ancienne, mais je pensais ajouter une autre réponse pour les futurs utilisateurs.

J'ai constaté que cela se produisait tout à l'heure dans un projet sur lequel je travaillais après son déploiement dans CI/Staging. La solution consistait à basculer la valeur de compilation debug = "true" dans les deux sens lors du déploiement de chaque version sur chaque environnement, et cela se règlerait tout seul.

0
Lari Tuomisto