如何从Web API Action返回Xml而不是JSON?

时间:2013-03-25 09:51:07

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

如何在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

1 个答案:

答案 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有一套自己需要注意的限制。