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);
    }
.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top