如何在Web API Controller中配置操作,以返回XML而不是JSON?
我有一个动作,它返回一个具有XmlElement属性的UserProfile对象:
[HttpGet]
public UserProfile SearchByEmail(string siteName, string email)
{
var userProfile = this._profileFinderByEmail.Find(siteName, email);
if (userProfile == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
return userProfile;
}
当我运行此操作时,它返回application / json而不是xml。我怎么能返回xml?
根据Fiddler的判断,我发送的请求标头具有以下Accept标头密钥:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
我希望它能返回xml,但事实并非如此。
如何解决?
我还在WebApiConfig类中设置了以下值:
GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;
从Chrome /网络标签中查看,我可以看到以下错误:
Status Code:406 Not Acceptable
答案 0 :(得分:1)
标题看起来正确,因此首先应检查格式化程序是否存在。您可以使用以下代码段输出所有已注册的格式化程序(您可以在操作方法中使用它):
foreach (var formatter in GlobalConfiguration.Configuration.Formatters)
{
System.Diagnostics.Debug.WriteLine(String.Format("{0}: {1}", formatter.GetType().Name, String.Join(", ", formatter.SupportedMediaTypes.Select(x=>x.MediaType))));
}
结果将显示在 Visual Studio 的输出窗口中(将显示输出从显示到调试) 。你应该寻找这样的行:
XmlMediaTypeFormatter: application/xml, text/xml
如果它不存在则意味着它以某种方式被移除,您需要在应用程序中找到该部分代码。如果它存在,则很可能意味着DataContractSerializer
无法序列化您的实体(您可以阅读有关受支持的类型here的更多信息)。
您还提到您在实体中使用XmlElement
属性。默认情况下,XmlMediaTypeFormatter
正在使用DataContractSerializer
(如上所述),这将忽略这些属性。如果您想将其切换为XmlSerializer
,可以使用以下代码(例如在Global.asax
中):
GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;
当然XmlSerializer
有一套自己需要注意的限制。