如何强制ASP.NET Web API根据我的input返回JSON或XML数据?

我尝试根据input获取输出的XML或JSON数据。 我使用了下面的WEB API代码,但不能精确输出。

public string Get(int id) { if (GlobalConfiguration.Configuration.Formatters.XmlFormatter == null) { GlobalConfiguration.Configuration.Formatters.Add(GlobalConfiguration.Configuration.Formatters.XmlFormatter); } if (GlobalConfiguration.Configuration.Formatters.JsonFormatter == null) { GlobalConfiguration.Configuration.Formatters.Add(GlobalConfiguration.Configuration.Formatters.JsonFormatter); } if (id == 1) { GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.JsonFormatter); GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true; } else { GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter); GlobalConfiguration.Configuration.Formatters.JsonFormatter.UseDataContractJsonSerializer = true; } return "value"; } 

global.asax文件中添加下面的代码app_start事件。 在API Url中添加查询string:

 GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add( new QueryStringMapping("type", "json", new MediaTypeHeaderValue("application/json"))); GlobalConfiguration.Configuration.Formatters.XmlFormatter.MediaTypeMappings.Add( new QueryStringMapping("type", "xml", new MediaTypeHeaderValue("application/xml"))); 

例如:

 for xml : http://localhost:49533/api/?type=xml for json: http://localhost:49533/api/?type=json 

你正在尝试做什么将不会在multithreading环境中工作。 您无法在每个请求的基础上添加或删除格式化程序集。 这是完成你想要的更好的方法。

 public HttpResponseMessage Get(int id) { Foo foo = new Foo(); var content = new ObjectContent<Foo>(foo, ((id == 1) ? Configuration.Formatters.XmlFormatter : Configuration.Formatters.JsonFormatter)); return new HttpResponseMessage() { Content = content }; } 

仔细看了一下,在另一个post里find了你的答案:

 public HttpResponseMessage Get(int id) { string content = "value"; if (id == 1) { return Request.CreateResponse<string>(HttpStatusCode.OK, content, Configuration.Formatters.JsonFormatter); } return Request.CreateResponse<string>(HttpStatusCode.OK, content, Configuration.Formatters.XmlFormatter); } 

它也可以强制接受头文件。 好的select,如果你不总是返回HttpResponseMessage's 。 即

 Request.Headers.Add("Accept", "text/json"); return Request.CreateResponse(HttpStatusCode.OK, yourobject); 

要么

 Request.Headers.Add("Accept", "application/xml"); return new Rss20FeedFormatter(feed); 

如果您的请求指定了MIMEtypes,例如application/json ,那么web API将适当地格式化响应。

如果您试图手动debugging您的web api,请使用像Fiddler 2这样的工具来指定types。

本文介绍了这个概念。

尽pipevijayjan15接受的答案似乎是针对具体情况(即使用MediaTypeMappings)的最佳方式,但也可以使用两种不同的方法,一种是返回XML,另一种是返回JSON。 为此,可以实例化一个特定于控制器的HttpConfiguration(以避免修改GlobalConfiguration.Configuration中的一个):

 public MyReturnType GetMyTypeAsXml() { Configuration = new HttpConfiguration(); Configuration.Formatters.Clear(); Configuration.Formatters.Add(new XmlMediaTypeFormatter()); return new MyReturnType(); } public MyReturnType GetMyTypeAsJson() { Configuration = new HttpConfiguration(); Configuration.Formatters.Clear(); Configuration.Formatters.Add(new JsonMediaTypeFormatter()); return new MyReturnType(); } 

我不确定在启动HttpConfiguration的一个新实例时有多less开销(我怀疑不是很多),但是新实例带有默认填充的Formatters集合,这就是为什么你必须在实例化之后清除它它。 请注意,如果您使用Configuration = new HttpConfiguration(),而直接修改configuration,它会修改GlobalConfiguration.Configuration属性(所以,它会影响您所有其他WebApi方法 – 不好!)。

QueryStringMapping`是很好的解决scheme,但我需要一个types的默认值。

对于xml: localhost:49533/api/?type=xml

对于json: localhost:49533/api/

我解决了这样的情况:

 GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); var jSettings = new JsonSerializerSettings(); GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = jSettings; GlobalConfiguration.Configuration.Formatters.XmlFormatter.MediaTypeMappings.Add(new QueryStringMapping("xml", "true", new MediaTypeHeaderValue("application/xml")));