SORU
28 Kasım 2012, ÇARŞAMBA


Web API Yönlendirme - {denetleyicisi} {eylem} apı///{id} "bozukluklar" {denetleyicisi} apı//{id}

Genel olarak varsayılan Yol var.asax:

 RouteTable.Routes.MapHttpRoute(
         name: "DefaultApi",
         routeTemplate: "api/{controller}/{id}",
         defaults: new { id = System.Web.Http.RouteParameter.Optional }
         );

Başka bir yol yarattım belirli bir işlevi hedef, mümkün olmak istedim:

RouteTable.Routes.MapHttpRoute(
         name: "WithActionApi",
         routeTemplate: "api/{controller}/{action}/{id}",
         defaults: new { id = System.Web.Http.RouteParameter.Optional }
         );

Yani, benim denetleyicisi, ben:

    public string Get(int id)
    {
        return "object of id id";
    }        

    [HttpGet]
    public IEnumerable<string> ByCategoryId(int id)
    {
        return new string[] { "byCategory1", "byCategory2" };
    }

...//Kayıtları/apı/5 bycategoryid arayıp bana istediğimi verecek. Ancak, .../apı/kayıtlar/1 beni arayıp hata verir "Birden fazla eylem talep eşleşen bulundu: ...".

Anlıyorum neden bu yolları sadece tanımlamak ne URL geçerli değil, ama gelince eşleştirme işlevi, (int ıd) ve ByCategoryİd(int ıd) maç apı/{denetleyicisi}/{id}, "karıştırır" çerçevesinde.

Benim için varsayılan API rotayı yeniden işe almak, ve {eylem} ile bir tutmak için ne gerekiyor? Kendisi için .../api//5 recordbycategoryid rica ederim varsayılan API rota, maç için farklı bir kumanda RecordByCategoryİdController adlı yaratmayı düşündüm. Ancak, bir "" (böylece tatmin edici bir çözüm. kirli olduğunu buluyorum Bu cevaplar aradım ve öğretici orada {eylem} bir güzergah kullanarak bile bu sorun bahseder.

CEVAP
28 Kasım 2012, ÇARŞAMBA


Rota motorun içine kurallar eklemek gibi aynı sıra kullanır. İlk eşleşen kural alır sonra, diğer kuralları kontrol durdurmak ve denetleyici ve eylem aramak için bu zaman alacak.

Bu yüzden yapmanız gerekenler:

  1. Belirli kuralları göster 8 ** kullanmak anlamına gelir, genel kuralları(varsayılan), önce "" sonra "". DefaultApi WithActionApi

  2. Senin defaults: new { id = System.Web.Http.RouteParameter.Optional } parametresi "" id isteğe bağlı olduğunu bir kez çünkü kural gibi url "{ödev-1} /api//{part2}" asla gider "". DefaultApi WithActionApi çıkarın

  3. Senin için adlı bir eylem" girin. yol altyapısı söylemek "DefaultApi Ekle Aksi takdirde kumandanız birden fazla eylem sonra, motor kullanmak için hangi bilmeyecek ve atar "Birden fazla eylem talep eşleşen bulundu: ...". O zaman senin yöntemin Olsun maç yapmak, ActionNameAttribute kullanın.

Rotanızı bu gibi olmalıdır:

// Map this rule first
RouteTable.Routes.MapRoute(
     "WithActionApi",
     "api/{controller}/{action}/{id}"
 );

RouteTable.Routes.MapRoute(
    "DefaultApi",
    "api/{controller}/{id}",
    new { action="DefaultAction", id = System.Web.Http.RouteParameter.Optional }
);

Ve kumandanız:

[ActionName("DefaultAction")] //Map Action and you can name your method with any text
public string Get(int id)
{
    return "object of id id";
}        

[HttpGet]
public IEnumerable<string> ByCategoryId(int id)
{
    return new string[] { "byCategory1", "byCategory2" };
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Arun Kumar

    Arun Kumar

    18 Mart 2010
  • Kai Moosmann

    Kai Moosmann

    5 Temmuz 2006
  • monkophile

    monkophile

    25 Temmuz 2007