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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top