2014-01-15 39 views
3

如果你正在使用WCF,有很多不同的方法來替換DataContractResolver,我想用Web Api做同樣的事情。唯一的擴展點,我發現是這樣的:如何替換Web Api堆棧中的DataContractResolver?

GlobalConfiguration.Configuration.Formatters.XmlFormatter.SetSerializer<Person>(new DataContractSerializer(typeof(Person), null, Int32.MaxValue, false, false, null, new TypeNameVersioning())); 

我找東西的(僞代碼)行:

GlobalConfiguration.Configuration.Formatters.XmlFormatter.SetDataContractResolver = new TypeNameVersioning(); 
+0

DataContractResolver只能在DataContractSerializer的構造函數中設置,因此您確實需要創建一個新的DataContractSerializer – LostInComputer

+0

不是很完美,您還可以在DataContractSerializer的Read/Write方法中指定它。但是,這是旁白,WCF提供了擴展點,我很驚訝,網絡API似乎並沒有提供類似的東西 – Marius

回答

0

如果你想使用XmlSerializer然後

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true 

如果不能滿足您的需求,然後做

GlobalConfinguration.Configuration.Formatters.Clear(); 
GlobalConfinguration.Configuration.Formatters.Add(new YourOwnFormatterCanGoHere()); 

只是另一點。我一直都在使用Web API,現在已經有好幾年了,而且我很少使用格式化器。我用派生版本的HttpContent返回HttpResponseMessage。不要說你應該這樣做,只是說在Web API中有很多方法來做事情。格式化程序不是必需的。

+0

我很抱歉,但我沒有跟着你。格式化程序處理基於內容類型的序列化?如果你返回HttpResponseMessage,有人仍然需要將內容序列化到響應流中。 – Marius

+0

@Marius否,從HttpContent派生的類進行序列化。當你從web api返回一個CLR類型時,它將被放入一個ObjectContent實例,然後使用格式化程序來幫助它序列化。如果你不需要序列化任意的CLR類型,你可以返回一個派生的HttpContent。 –

+0

@Marius如果你看看這個項目https://github.com/darrelmiller/ndc/tree/master/ConferenceWebApi/Controllers,你可以看到我返回'Json-home'內容,'collection + json'內容和'hal'內容。 –