ASP.NET Web API:XMLFormatter认为他可以编写Json对象

时间:2012-06-15 09:07:47

标签: xml json asp.net-mvc-4 asp.net-web-api

我有这样的方法:

public JObject Get(int id)
        {
            return new JObject(new JProperty("Test", "Test"));
        }

如果我请求JSON,它工作正常,但如果我请求XML,我从web api框架获得HTTP-Errorcode 500(没有例外)。 XMLformatter似乎认为他可以编写json。 我可以用以下方法测试它:

bool test = GlobalConfiguration.Configuration.Formatters.XmlFormatter.CanWriteType(typeof(JArray));
            bool test2 = GlobalConfiguration.Configuration.Formatters.XmlFormatter.CanWriteType(typeof(JObject));
            bool test3 = GlobalConfiguration.Configuration.Formatters.XmlFormatter.CanWriteType(typeof(JProperty));
            bool test4 = GlobalConfiguration.Configuration.Formatters.XmlFormatter.CanWriteType(typeof(JValue));

它总是返回“true”。 我不想删除xmlformatter,但服务器抛出HTTP错误500是不可接受的,我不会生成并且无法解决。 最好的是XMLformatter可以序列化对象......

2 个答案:

答案 0 :(得分:6)

DataContractSerializer不支持匿名/动态类型(甚至是通用“对象”)。这就是为什么它没有被序列化为XML。

如果您想要XML序列化,则必须使用强类型对象。

答案 1 :(得分:1)

为什么要从Web API方法返回JObject?这是JSON特定的对象,它不是XML可序列化的。您不应该返回特定于格式的对象,

只是简单的模型对象(或HttpResponseMessage):

public object Get(int id)
{
    return new { Test = "Test" };
}

或直接强类型对象:

public class MyModel
{
    public string Test { get; set; }
}

然后:

public MyModel Get(int id)
{
    return new MyModel { Test = "Test" };
}

并让配置的媒体格式化程序完成将此对象序列化为客户端请求的正确格式的工作。不要在API操作中使用任何序列化格式的特定对象。这不是他们的责任。