簡體   English   中英

ASP.NET Web API XmlFormatter不起作用,回退到JsonFormatter

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM