![](/img/trans.png)
[英]Change JsonFormatter for a single request in ASP.NET Web API
[英]ASP.NET Web API XmlFormatter does not work, falls back to JsonFormatter
在過去的兩天里,我一直在努力弄清楚為什么XmlFormatter(通過DataContractSerializer)不能序列化我在Web API方法中返回的數據。 WebAPI決定仍然使用JSON,但我需要結果以XML格式顯示(根據將使用此API的應用程序)。 我已經將瀏覽器設置為發送Accept:application / xml以便解析器使用XmlFormatter(但結果始終是json)。
控制器:
public class MyController : ApiController
{
public MyDataResultList GetData(string someArgument)
{
// magic here that gets the data
MyDataResultList items = MyDataResultList.GetData(someArgument);
return items;
}
}
MyDataResultList包含在dll中,並且具有類似的布局:
[DataContract]
[CollectionDataContract(Name = "MyDataList")]
[KnownType(typeof(List<MyDataItem>))]
public class MyDataResultList : List<MyDataItem>
{
[DataMember]
public string SomethingHere
{
get;
set;
}
[DataMember]
public TimeSpan StartTime
{
get;
set;
}
[DataMember]
public TimeSpan StopTime
{
get;
set;
}
}
我曾嘗試將UseXmlSerializer設置為true,但是我需要在客戶端使用DataContractSerializer來正確反序列化結果。
所以最后一個問題是,如果無法使用第一個格式化程序進行序列化,是否可以配置Web API引發異常? 我認為(以我的觀點)這是非常誤導和過於抽象的,以至於使其僅默默地退回到JSON,而沒有提供任何引起原因的線索。
更新:使用DCS手動序列化MyDataResultList引發InvalidDataContractException:具有CollectionDataContractAttribute屬性的類型'MyDataResultList'是無效的集合類型,因為它具有DataContractAttribute屬性。 但是潛在的問題仍然存在:如何使Web API將其扔給我,而不是無聲地退回到JSON? (並使調試更加困難)
Update2: DataContract序列化程序似乎完全跳過SomethingHere / StartTime / EndTime屬性,即使它們上具有[DataMember]。
您的診斷方式是正確的,是的,Web API的內容協商過程將嘗試根據一堆邏輯找到最佳的格式化程序(例如:如果存在,則接受標題;如果不存在,則為Content-Type標題,詢問每個格式化程序是否可以序列化類型等)。
您可以通過執行以下操作來禁用此默認行為(即在可以寫入/序列化類型的格式化程序列表中找到第一個格式化程序)。 這將導致生成406 Not Acceptable
響應:
DefaultContentNegotiator negotiator = new DefaultContentNegotiator(excludeMatchOnTypeOnly: true);
config.Services.Replace(typeof(IContentNegotiator), negotiator);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.