Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET Web API XmlFormatter不起作用,返回到JsonFormatter_C#_Asp.net_Asp.net Web Api_Datacontractserializer - Fatal编程技术网

C# ASP.NET Web API XmlFormatter不起作用,返回到JsonFormatter

C# ASP.NET Web API XmlFormatter不起作用,返回到JsonFormatter,c#,asp.net,asp.net-web-api,datacontractserializer,C#,Asp.net,Asp.net Web Api,Datacontractserializer,在过去的两天里,我一直在绞尽脑汁试图弄明白为什么XmlFormatter(通过DataContractSerializer)不序列化我在WebAPI方法中返回的数据。WebAPI决定无论如何都要使用JSON,但我需要XML格式的结果(根据将使用此API的应用程序)。我已经将浏览器设置为发送Accept:application/xml,以便解析器使用XmlFormatter(但结果总是json) 控制器: public class MyController : ApiController {

在过去的两天里,我一直在绞尽脑汁试图弄明白为什么XmlFormatter(通过DataContractSerializer)不序列化我在WebAPI方法中返回的数据。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;
    }

}
[DataContract]
[CollectionDataContract(Name=“MyDataList”)]
[知识类型(类型(列表))]
公共类MyDataResultList:列表
{
[数据成员]
公共字符串在这里
{
得到;
设置
}
[数据成员]
公共时间跨度起始时间
{
得到;
设置
}
[数据成员]
公共时间间隔停止时间
{
得到;
设置
}
}
我已尝试将UseXmlSerializer设置为true,但我需要使用客户端上的DataContractSerializer将结果正确反序列化回来

所以最后一个问题是,如果web API无法使用任何先出现的格式化程序进行序列化,是否可以将其配置为引发异常?我相信(在我看来)这是非常误导人的,太抽象了,不能让它默默地回到JSON,而不给我任何关于是什么原因的线索

更新:使用DCS手动序列化MyDataResultList会引发InvalidDataContractException:具有CollectionDataContractAttribute属性的类型“MyDataResultList”是无效的集合类型,因为它具有DataContractAttribute属性。但潜在的问题仍然存在:如何让Web API将其扔给我,而不是默默地退回到JSON?(并且使调试更加困难)


Update2:DataContract序列化程序似乎完全跳过了此处/StartTime/EndTime属性的某些内容,即使它们上面有[DataMember]属性。

您的诊断方法是正确的,yeah Web API的内容协商过程将尝试根据一系列逻辑找到最佳的格式化程序(例如:接受标头(如果存在),内容类型标头(如果接受标头不存在),询问每个格式化程序是否可以序列化类型等)

您可以通过执行以下操作禁用此默认行为(即在可以写入/序列化类型的格式化程序列表中查找第一个格式化程序)。这将导致生成
406不可接受的
响应:

DefaultContentNegotiator negotiator = new DefaultContentNegotiator(excludeMatchOnTypeOnly: true);
config.Services.Replace(typeof(IContentNegotiator), negotiator);

公平地说,我做了一个自定义协商程序,如果由于某种原因无法序列化,它只会抛出底层异常。谢谢!