2014-10-10 13 views
10

Attribute Routing ve'u 'dan uygulamaya çalışıyorum ancak her ikisini de bir denetleyicide kullandığımda, sürümlenen öznitelik artık çalışmıyor.Web Api 2 API Yönlendirme için Çoklu Öznitelikleri tanımayan (Sürüm oluşturma)

Öznitelik Yönlendirme ile güzel oynamak için onu özniteliğinde değiştirmek için ne gerekir? Kod Örneğin

gibi yolları değiştirmek sonra örnek projeyi indirmek (veya sadece yukarıdaki bağlantıdan birkaç dosyalarına bakmak) ve:

// When I use the RoutePrefix, VersionedRoute no longer works (Sending "Api-Version" through http header doesn't route correctly 
// If I remove the RoutePrefix I can use VersionedRoute again 
// What do I need to change in its code to be able to use both? 

[VersionedRoute("api/Customers", 1)] // This route would be used as http://url/api/customers with a header of "api-version: 1" 
[RoutePrefix("api/v1/Customers")] // This route would be used purely through url versioning of http://url/api/v1/Customers 
public class CustomersV1Controller : ApiController { 

    /* Other stuff removed */ 

    [VersionedRoute("api/Customer", 1)] // I'd rather not have to use this here at all and just use a single one on the class, but having both nor just one on either works right now. 
    [Route("")] 
    public IHttpActionResult Get() 
    { 
     return Json(_customers); 
    } 
} 

VersionedRoute Code

VersionConstraint Code

Düzenleme : Lütfen daha fazla bilgiye ihtiyacınız varsa, hatta fikirlerinizi iletmeniz veya bir şeyler göndermeniz gerekiyorsa lütfen bize bildirin :)

Edit2: İşte bir Ben ne yapmak istediğimin bir örneği Troy Hunt'un Blog'undan: http://www.troyhunt.com/2014/02/your-api-versioning-is-wrong-which-is.html

Edit3: Kod ve kod dizilerinin çoğunu azaltacağından, kod yazmak istediğim nokta burası.

[VersionedRoute("api/Customers", 1)] // This route would be used as http://url/api/customers with a header of "api-version: 1" 
[RoutePrefix("api/v1/Customers")] // This route would be used purely through url versioning of http://url/api/v1/Customers 
public class CustomersV1Controller : ApiController { 

    /* Other stuff removed */ 
    [Route("")] 
    public IHttpActionResult Get() 
    { 
     // Removed 
     return Ok(customers); 
    } 


    [Route("{id:int}")] 
    public IHttpActionResult GetById(int id) 
    { 
     // Removed 
     return Ok(customer); 
    } 
} 

[VersionedRoute("api/Customers", 2)] // This route would be used as http://url/api/customers with a header of "api-version: 2" 
[RoutePrefix("api/v2/Customers")] // This route would be used purely through url versioning of http://url/api/v2/Customers 
public class CustomersV2Controller : ApiController { 

    /* Other stuff removed */ 
    [Route("")] 
    public IHttpActionResult Get() 
    { 
     // Removed 
     return Ok(customersThatAreDifferentThanV1); 
    } 


    [Route("{id:int}")] 
    public IHttpActionResult GetById(int id) 
    { 
     // Removed 
     return Ok(customerThatIsDifferent); 
    } 
} 

Düzenleme: Son yumru, yalnızca çalışan kontrolör nitelik düzeyinde değil, işlem başına, rota başına bir kez rota sürüm bilgisini yazmak zorunda.

+0

tam olarak yapmaya çalıştığımız şey: böylece sürüm her zaman önüne eklemeniz gerek olmazdı

[RoutePrefix("api")] public class CustomersV1Controller : ApiController { /* Other stuff removed */ [VersionedRoute("Customers", 1)] [Route("v1/Customers")] public IHttpActionResult Get() { return Json(_customers); } } 

bir iyileştirme yerine Route kendi özelliğini yaratmak olurdu? – DavidG

+0

@DavidG Her iki VersionedRoute ("Müşteri", 1) 'yi kullanmaya çalışıyorum. Bu, # sürümünün sağlanması için http üstbilgileri kullanmamı ve bir" RoutePrefix ("v1/Customer /") 'ın kullanılmasını sağlar. url üzerinden versiyonlama için. Temel olarak hem üstbilgi hem de URL sürümlerini desteklemek istiyorum. Ancak 'RoutePrefix' uygulandığında 'VersionedRoute' özniteliği çalışmayı durdurur. – John

+0

Yapılandırmanız projeyi oluştururken neye benziyor? – entropic

cevap

13

Route ve VersionedRoute özelliklerin birlikte iyi çalışıyor, ancak RoutePrefix özellik de VersionedRoute (erişmeyi deneyin/API/v1/Müşteriler/API/Müşteriye uygulanmaktadır - Bir yanıt alırsınız zaman api-versiyon başlığı

aşağıdaki kod doğru yanıt dönen sizin örnekte iki URL'den açısından istenilen davranışı üretecektir, ama belli ki bu sınıfın üstündeki birini VersionedRoute ve bir RoutePrefix istemekle sorununuzu çözmez) ayarlanır . Bunun için başka bir yaklaşım gerekli olacaktır. Bununla birlikte, farklı api sürümleri için ayrı denetleyicilere sahip olabilirsiniz.

public class CustomVersionedRoute : Attribute, IHttpRouteInfoProvider 
{ 
    private readonly string _template; 

    public CustomVersionedRoute(string route, int version) 
    { 
     _template = string.Format("v{0}/{1}", version, route); 
    } 

    public string Name { get { return _template; } } 
    public string Template { get { return _template ; } } 
    public int Order { get; set; } 
} 

[RoutePrefix("api")] 
public class CustomersV2Controller : ApiController 
{ 
    /* Other stuff removed */ 

    [VersionedRoute("Customers", 2)] 
    [CustomVersionedRoute("Customers", 2)] 
    public IHttpActionResult Get() 
    { 
     return Json(_customers); 
    } 
} 
+0

Doğru, bu çok sayıda kodla sonuçlanır :(. VersionedRoute' ve sınıfın en üstünde bir 'RoutePrefix' ve daha sonra altta kalan yollar hakkında endişelenmenize gerek yok.Roepeprefix şeyler tutmak için sabitler kullanarak bir iş var, ama neredeyse hayal edemeyeceğiniz gibi Olması gerektiği kadar temiz (olabilir) – John

+0

Benim sorum, her biri için bir 'VersionedRoute' ve bir 'RoutePrefix' nasıl alabilirim böylece her bir yöntemin üzerinde sürüm bilgisi koyarak hakkında endişelenmenize gerek yok. Her birinin üstünde el ile belirtebilirim fakat temiz ve kuru kalmasını istiyorum. – John

+0

Emin olmadığım bir durumda, bir yönlendirme, 'Rota' özniteliğini kendiniz yaparak toparlamak olacaktır. sadece konstanı geçebildiğin düzenleme) nts ve bir sürüm, ancak her bir yol için bir tane olmak üzere, her yönteme iki özniteliğe hala gereksinim duyarsınız. – embee

İlgili konular