1

I try to something on Web Api. First I will share my WebApiConfig

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional },
            constraints: new { id = @"^[0-9]+$" }
        );

        config.Routes.MapHttpRoute(
            name: "ApiCategory",
            routeTemplate: "api/tales/{category}/{id}",
            defaults: new { controller = "Tales", id = RouteParameter.Optional},
            constraints: new { category = @"^[a-z]+$" }
        );

I read this issue and I fix my apiconfig file. My purpose like this:

  1. List GetAllTales() = api/tales/ -> 404 Not Found
  2. Tale GetTale(int id) = api/tales/1 -> Ok!
  3. List GetAllTalesByCategory(string categoryName) = api/tales/kids -> Ok!
  4. Tale GetTalesByCategoryAndId(string categoryName, int id) = api/tales/kids/1 -> Ok!

İf u wonder my ApiController

[HttpGet]
    public Tale GetAllTalesByCategoryAndId(string category, int id){}

    [HttpGet]
    public IEnumerable<Tale> GetAllTalesByCategory(string category){}

    [HttpGet]
    public IEnumerable<Tale> GetAllTales(){}

    [HttpGet]
    public Tale GetTale(int id){}

Thanks for all replies.

Community
  • 1
  • 1
BerdaN
  • 49
  • 1
  • 9
  • Put your custom route before the default one or the default one will pick up your requests. – Ant P Dec 13 '13 at 22:16
  • Actually I dont get it. İf I put costum route /api/tales/kids gives an error. Because this send a request GetTale(int id). – BerdaN Dec 13 '13 at 22:24

1 Answers1

1

You need to switch the route order. Default route will handle the request when you don't specify an id (api/tales) so you need to place your custom route before that.

config.Routes.MapHttpRoute(
        name: "ApiCategory",
        routeTemplate: "api/tales/{category}/{id}",
        defaults: new { controller = "Tales", 
                        id = RouteParameter.Optional, 
                        category = RouteParameter.Optional});

config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional },
        constraints: new { id = @"^[0-9]+$" }
    );
Ufuk Hacıoğulları
  • 37,978
  • 12
  • 114
  • 156
  • I got it. How can I switch the routes? As u said I didn't use constraint for default route. But if I can do it(delete constraint) /api/tales/kids send a request GetTale(int id). I dont know how can I fix it. – BerdaN Dec 13 '13 at 22:36
  • Actually I dont have custom route. I have two route and it's here :/ – BerdaN Dec 13 '13 at 22:52
  • @BerdaN ApiCategory is the custom route. – Ufuk Hacıoğulları Dec 13 '13 at 22:52
  • Hocam kusura bakma 2 saattir uğraşıyorum kafam döndü. Senin dediğin gibi yaptım ApiCategory üstte onun altında DefaultApi var ama yine /api/tales/ 404 dönüyor. – BerdaN Dec 13 '13 at 22:57
  • @BerdaN İlginç. Bende aynı route'larla /api/tales cevap veriyor. Sadece api/tales/kids hata veriyor, o da id nullable olmadığı için. – Ufuk Hacıoğulları Dec 13 '13 at 23:21
  • Cidden ilginç. .Net frameworkünden kaynaklanıyor olabilir mi? .Net Framework 4.5 i kullanıyorum. – BerdaN Dec 13 '13 at 23:27
  • @BerdaN Cevabı güncelledim. Tekrar dener misin? category de optional olmak zorunda. Regex'i kaldırmak zorunda kaldım, ona bakman lazım. id için integer constraint'i koyabilirsin belki. – Ufuk Hacıoğulları Dec 13 '13 at 23:37
  • Sağol hocam denedim ama bu seferde api/tales/2 isteği GetAllTalesByCategory(string category) ye giriyor diğerlerinde sorun yok. – BerdaN Dec 14 '13 at 06:56
  • Sırarsını değiştirdim route ların yani DefaultApi üstte olunca api/tales/2 isteği direk ona geldi ve bu sorunum çözüldü. Tekrar teşekkür ederim. – BerdaN Dec 14 '13 at 07:04