3

我有一个ASP.Net Web API项目,它已经包含控制器以JSON格式返回结果。现在我必须添加新的控制器,它应该只接收和返回XML。我知道我可以使用下面的选项推控制器返回XML序列化对象:ASP.Net Web API。一个项目中的JSON和XML响应

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true 

但是,如果我这样做,我想到的是,旧的控制器也将返回XML格式的数据,对不对?这不是我所需要的。那么,我如何才能实现我的目标并仅从一些控制器返回XML序列化对象?谢谢。

UPDATE

我曾尝试建议的方法,但它并没有为我工作。我正在使用Fiddler进行测试。请注意这个结果仍然是JSON(最后截图)下面是其他信息:

控制器:

Controller

Request类:

Request class

Response类:

Response class

请求在提琴手:在提琴手

Request in Fiddler

响应:

Response in Fiddler

回答

4

内容协商或序列号是不是管制员应予以关注。

开箱即用ASP.NET Web API可以返回XML和JSON内容,客户端可以通过设置Accept HTTP标头来请求特定的格式。

将其设置为:

Accept: application/json 

,如果你想获得JSON回来

Accept: application/xml 

,如果你想获得对XML的支持

编辑: 还要注意在默认情况下该Web API使用DataContractSerializer,在您的评论中回答问题:

[DataContract(Namespace = "schemas.datacontract.org/2004/07/Test.Models")] 
public class TheThing 
{ 
    [DataMember] 
    public string Name { get; set; } 
    [DataMember(Name = "contentname")] 
    public string ContentName { get; set; } 
} 
+0

谢谢你的回答。我已经删除了强制XML序列化的行(在原始问题中提到过)。但现在我发现XML序列化忽略了设置XML元素名称的属性:[XmlElement(“contentname”)] public string ContentName {get;组; }我能以某种方式修复它吗? – Antipod 2013-03-11 21:16:32

+0

我也想在我的XML响应中避免以下属性:xmlns:i =“http://www.w3.org/2001/XMLSchema-instance”and xmlns =“http://schemas.datacontract.org/ 2004/07/Test.Models“ – Antipod 2013-03-11 21:25:19

+0

Piotr Walat,谢谢你的答案中的编辑部分。不幸的是,它不适合我。我不知道为什么。我用一些截图更新了我的原始问题。 – Antipod 2013-03-11 22:29:14

0

我已经运行了一些接受不起作用的API。我对那些API发现,如果接受的是不工作的,如果我设置“的Content-Type”头

Content-Type: application/xml

这将导致控制器以实物与XML响应响应。

它确实出现在Webapi2中,Accept头现在会导致控制器返回预期的application/xml响应。这可能是WebAPI早期版本的问题。