Routage API 404 Si le paramètre facultatif a raté
-
21-12-2019 - |
Question
J'ai ce routage mis en place dans mon webapiconfig
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
}
et ces méthodes à l'intérieur /api/productController.cs
public object GetProduct(int id)
{
var productRepo = new ProductRepository(db);
var product = productRepo.GetItem(id);
return product.ToAnonymousType();
}
public object GetTest()
{
var productRepo = new ProductRepository(this.db);
var product = productRepo.GetItem(10000);
return product.ToAnonymousType();
}
Je peux demander / API / Produit / GetProduct / 10000 et récupérer JSON.
Si je demande / API / Produit / getTest, je reçois un 404
Si je change getestest à
public object GetTest(int id)
et demande / API / Produit / getTest / 10000 Je reçois JSON.
Je ne sais pas pourquoi ce 404 se produit.J'ai d'autres contrôleurs (pour les demandes non-API) qui manipulent des demandes normales.Je suis nouveau à MVC après quelques années de formes Webfres, et cela m'a soulevé.Pour référence, voici mon rouconfig
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
et mon application_start
protected void Application_Start()
{
BundleConfig.RegisterBundles(BundleTable.Bundles);
RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);
}
La solution
Ceci est dû à la commande de vos itinéraires.
RouteConfig.RegisterRoutes(RouteTable.Routes);
est appelé avant
GlobalConfiguration.Configure(WebApiConfig.Register);
et votre méthode RegisterRoutes contient une route par défaut (et très générique)
url: "{controller}/{action}/{id}"
Cette règle générique (par défaut) correspondre à votre modèle d'URL de
api/product/gettest
Avant que votre route WebAPI aura une chance de le faire correspondre.
Vous pouvez soit vous débarrasser de cette voie super générique si nécessaire (et utilisez des itinéraires plus spécifiques) ou simplement déplacer l'appel sur
GlobalConfiguration.Configure(WebApiConfig.Register);
venir avant l'appel à
RouteConfig.RegisterRoutes(RouteTable.Routes);
dans votre global.aSax.
J'ai construit un échantillon avec toutes les informations que vous avez données et que vous déplaçez cet appel fonctionnait tout simplement bien. J'espère que cela vous aidera.