2013-01-14 21 views
6

Başlık az çok ya da daha önemsizdir. JSON MediaTypeFormatter'ı, rota başına farklı davranması için yapılandırmaya çalışıyorum.Web API'sında Route Formatter Yapılandırması Başına

Özellikle, WebAPI'mda aynı denetleyiciyle eşlenen iki yol var. Her rota aynı işlemi gerçekleştirir ve aynı verileri döndürür, ancak mevcut tüketicilerle geriye doğru karşılaştırılabilir olmaları için çıktılarını biraz farklı şekilde biçimlendirmeleri gerekir.

Denetleyiciye, eski rotada veya yeni rotada isteğin gelip gelmediğini belirlemek ve buna göre biçimlendiricileri değiştirmek için bazı kodlar koyabilirim.

Gerekli durumlarda biçimlendiricileri değiştirmek için bir ActionFilter kullanabilirim.

Ancak, her bir yol düzeyinde biçimlendiricileri yapılandırmanın bir yolu olup olmadığını merak ettim, çünkü bu, API'mn farklı davrantığı soyutlama seviyesidir. Bu, Yol Yapılandırması veya bir Delege İşleyicisi'nde olabilir.

Herhangi bir öneriniz var mı?

cevap

6

Ben senin iki JSONs ne kadar farklı tamamen emin değilim ve tam olarak ne onlarla yapıyoruz, ama bana sorarsan, ben biçimlendiricisinde yapardım:

public class MyJsonMediaTypeFormatter : JsonMediaTypeFormatter 
{ 
    private IHttpRouteData _route; 

    public override MediaTypeFormatter GetPerRequestFormatterInstance(Type type, HttpRequestMessage request, System.Net.Http.Headers.MediaTypeHeaderValue mediaType) 
    { 
     _route = request.GetRouteData(); 
     return base.GetPerRequestFormatterInstance(type, request, mediaType); 
    } 

    public override System.Threading.Tasks.Task WriteToStreamAsync(Type type, object value, System.IO.Stream writeStream, HttpContent content, TransportContext transportContext) 
    { 
     if (_route.Route.RouteTemplate.Contains("legacy")) 
     { 
      //here set the SerializerSettings for non standard JSON 
      //I just added NullValueHandling as an example 
      this.SerializerSettings = new JsonSerializerSettings 
       { 
        NullValueHandling = NullValueHandling.Ignore 
       }; 
     } 

     return base.WriteToStreamAsync(type, value, writeStream, content, transportContext); 
    } 
} 

Verirsin daha sonra bu varsayılan JsonMEdiaTypeFormatter ile değiştirin.

Web API olarak
config.Formatters.RemoveAt(0); 
    config.Formatters.Insert(0, new MyJsonMediaTypeFormatter()); 

yalnızca belirli bir rota üzerinde çalışan DelegatingHandler olabilir, ancak Formatters koleksiyon küresel olduğundan gerçekten mantıklı değil bu yüzden zamanında bile bir route- o değiştirerek hiçbir anlamı yoktur kapsamlı işleyici.

+0

Evet, özel bir MediaTypeFormatter kullanmayı düşünmüştüm; Yukarıdaki örneğiniz, elde etmeye çalıştığım şeylere benzer; ama mantığı koyarak, uygulama mantığını, uygulamadan bağımsız olarak uygulanması gereken bir şeyle tanıştırmaktan endişe duyuyorum. Seçiciyim, biliyorum ve çözümünüz kesinlikle işe yaramaz - ama içimdeki temizlikçi benim endişeleri iyi ve gerçekten ayrı tutmayı sever. –

+1

Her denetleyici yapılandırmasını kullanabilirsiniz (* IControllerConfiguration * http://blogs.msdn.com/b/jmstall/archive/2012/05/11/per-controller-configuration-in-webapi.aspx) ve bunu kaydettirin "özel" biçimlendirici yalnızca uyguladığı bir denetleyici için. Bu şekilde çekirdek uygulama hala varsayılan biçimlendirici kullanır, ancak daha fazla gereksinimi olan bir denetleyici, belirli bir kullanır. –

+0

Aslında bunun gerçekten bir Eylem Filtresi kullanmanın nasıl farklı olduğunu görmüyorum. Infact Bir IControllerConfiguration özniteliği ile bunu başarabileceğime emin değilim, çünkü bunlar içeriğe dayalı bilgiler için rotaya/isteklere erişemezler. –

İlgili konular