Routing API 404 Se il parametro opzionale mancato
-
21-12-2019 - |
Domanda
Ho questo routing configurato nel mio 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;
}
.
E questi metodi all'interno di /pi/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();
}
.
Posso richiesta / API / Prodotto / GetProduct / 10000 e prendi indietro JSON.
Se richiesto / API / Prodotto / Getsty ottengo un 404
Se cambio Getst to
public object GetTest(int id)
.
e Richiesta / API / Prodotto / GetTest / 10000 I Got JSON.
Non ho idea del motivo per cui questo 404 sta accadendo.Ho altri controller (per richieste non API) che stanno la gestione delle richieste normali.Sono nuovo a MVC dopo alcuni anni di webforms, e questo mi ha stangato.Per riferimento, ecco la mia routeconfig
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 }
);
}
.
e la mia applicazione_start
protected void Application_Start()
{
BundleConfig.RegisterBundles(BundleTable.Bundles);
RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);
}
. Soluzione
Questo è dovuto all'ordine dei tuoi percorsi.
RouteConfig.RegisterRoutes(RouteTable.Routes);
.
è chiamato prima
GlobalConfiguration.Configure(WebApiConfig.Register);
.
E il tuo metodo RegisterRoutes contiene un percorso predefinito (e molto generico)
url: "{controller}/{action}/{id}"
.
Questa regola generica (predefinita) corrisponderà al tuo modello URL di
api/product/gettest
.
Prima che il tuo percorso di Webpi avrà la possibilità di abbinarlo.
Puoi liberarti di quella rotta super generica se non necessario (e utilizzare percorsi più specifici) o semplicemente spostare la chiamata su
GlobalConfiguration.Configure(WebApiConfig.Register);
.
a venire prima della chiamata a
RouteConfig.RegisterRoutes(RouteTable.Routes);
.
nel tuo globale.asax.
Ho costruito un campione con tutte le informazioni che hai dato e spostando che la chiamata ha funzionato bene. Spero che questo aiuti.