2013-01-03 57 views
7

在哪裏可以指定ASP.NET Web API中的自定義序列化/反序列化?在Web API/APIController中控制序列化

我們的應用程序的吞吐量需要消息的快速序列化/反序列化,因此我們需要嚴格控制這部分代碼,以便使用我們的家庭brew或OSS。

我檢查了各種資源,例如this,它解釋瞭如何創建一個自定義值提供程序,但我還沒有看到一個解釋端到端過程的例子。

任何人都可以指示/顯示序列化傳入/傳出消息的方式嗎?

另外Web API中類似於this one for WCF的各種注入點/事件接收器的圖表感謝!

+0

實現['ISerializable'](http://msdn.microsoft.com/zh-cn/library/system.runtime.serialization.iserializable.aspx)? –

+0

嗯......沒有那麼像WCF的做事方式。 – Alwyn

回答

6

您正在尋找的擴展點是MediaTypeFormatter。它控制從請求主體讀取並寫入響應主體。這可能是寫自己的格式最好的資源:在回答

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

+0

看起來像這樣,雖然它似乎每個主機只有一個串行器有沒有辦法讓這個串行器配置在控制器/動作級別? – Alwyn

+0

這是可能的。有幾種方法可以處理這個問題:1)您可以在創建響應時明確地說出要使用哪個格式化程序。您可以使用Request.CreateResponse擴展方法來選取要使用的格式化程序。或2)您可以使用每個控制器配置來爲特定控制器自定義格式化程序。 –

+2

這是另一個關於WebAPI可擴展性的好文檔:http://www.asp.net/web-api/overview/extensibility/configuring-aspnet-web-api。特別是它解釋了我剛剛提到的每個控制器配置。 –

1

這裏的代碼示例的情況下,以上鍊接死亡

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); 
    } 
} 

然後,你需要在Global.asax

註冊您的格式
protected void Application_Start() 
    { 
     config.Formatters.Add(new MerlinStringMediaTypeFormatter()); 
    } 

希望這可以爲您節省一些時間。