2

我有这样的方法:

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));

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

4

2 回答 2

6

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

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

于 2012-06-15T12:42:22.820 回答
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 操作中使用任何序列化格式的特定对象。那不是他们的责任。

于 2012-06-15T09:10:41.117 回答