2013-01-03 29 views
7

Gdzie można określić niestandardową serializację/deserializację w interfejsie API sieci ASP.NET?Sterowanie serializacją w interfejsie API sieci Web/APIController

Przepustowość naszej aplikacji wymaga szybkiej serializacji/deserializacji wiadomości, dlatego musimy ściśle kontrolować tę część kodu, aby użyć naszego domowego browaru lub jednego z OSS.

Sprawdziłem różne źródła, takie jak this, które wyjaśniają, jak utworzyć dostawcę wartości niestandardowej, ale nie widziałem jeszcze przykładu, który wyjaśniałby proces od początku do końca.

Czy ktoś może skierować/pokazać mi drogę do serializowania wiadomości przychodzących/wychodzących?

Doceniono również schemat różnych punktów wtrysku/zlewów zdarzeń w interfejsie API WWW podobnym do this one for WCF!

+0

Implementacja ["ISerializable"] (http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable.aspx)? –

+0

Mmm ... nie, to wydaje się być sposobem na robienie rzeczy w WCF. – Alwyn

Odpowiedz

6

Punkt docelowy, którego szukasz, to MediaTypeFormatter. Kontroluje czytanie z treści żądania i zapisywanie w treści odpowiedzi. To może być najlepszym źródłem do pisania własnego formatowania:

http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters

+0

Wygląda na to, chociaż wygląda na to, że istnieje tylko jeden serializer na hosta, czy istnieje sposób na skonfigurowanie tego serializera na poziomie kontrolera/działania? – Alwyn

+0

Jest to możliwe. Jest kilka sposobów na rozwiązanie tego problemu: 1) Możesz jednoznacznie określić, którego formatera chcesz użyć podczas tworzenia odpowiedzi. Możesz użyć metody rozszerzenia Request.CreateResponse, aby wybrać formater, którego chcesz użyć. Lub 2) Możesz użyć konfiguracji kontrolera, aby dostosować formatery dla konkretnego kontrolera. –

+2

Oto kolejny dobry dokument dotyczący rozszerzalności w interfejsie WebAPI: http://www.asp.net/web-api/overview/extensibility/configuring-aspnet-web-api. W szczególności wyjaśnia on konfigurację pojedynczego kontrolera, o której wspomniałem. –

1

Oto przykład kodu w przypadku łącza w odpowiedzi powyżej umiera

public class MerlinStringMediaTypeFormatter : MediaTypeFormatter 
{ 
    public MerlinStringMediaTypeFormatter() 
    { 
     SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/plain")); 
    } 

    public override bool CanReadType(Type type) 
    { 
     return type == typeof (YourObject); //can it deserialize 
    } 

    public override bool CanWriteType(Type type) 
    { 
     return type == typeof (YourObject); //can it serialize 
    } 

    public override Task<object> ReadFromStreamAsync( 
     Type type, 
     Stream readStream, 
     HttpContent content, 
     IFormatterLogger formatterLogger) 
    { 
     //Here you put deserialization mechanism 
     return Task<object>.Factory.StartNew(() => content.ReadAsStringAsync().Result); 
    } 

    public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext) 
    { 
     //Here you would put serialization mechanism 
     return base.WriteToStreamAsync(type, value, writeStream, content, transportContext); 
    } 
} 

Następnie trzeba zarejestrować formatowania w Global.asax

protected void Application_Start() 
    { 
     config.Formatters.Add(new MerlinStringMediaTypeFormatter()); 
    } 

Mam nadzieję, że to zaoszczędzi ci trochę czasu.

Powiązane problemy