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 .
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.
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 }
);
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>
Assurez-vous également que votre contrôleur se termine par "Controller" comme dans "PizzaPieController".
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é
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.
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);
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 }
);
}
}
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).
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:
Get
(par exemple GetValues
ou simplement Get
).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.
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.
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.
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 mettantValueController
dans l'URI, le moteur de routage cherchait une classe nomméeValueControllerController
qu'il n'a pas trouvée.
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}
);
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
Dans mon cas, j'ai oublié de le faire dériver d'ApiController.
Donc, cela ressemblerait à
public class ValuesController : ApiController
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.
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.