0

如何在 Web API 控制器中配置操作以返回 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
4

1 回答 1

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的输出窗口中可见(将Show output from设置为Debug)。你应该寻找这样的行:

XmlMediaTypeFormatter: application/xml, text/xml

如果它不存在,则意味着它以某种方式被删除,您需要在应用程序中找到该部分代码。如果它在那里,则很可能意味着DataContractSerializer无法序列化您的实体(您可以在此处阅读有关支持的类型的更多信息)。

您还提到您XmlElement在实体中使用属性。默认情况下XmlMediaTypeFormatter使用DataContractSerializer(如上所述)将忽略这些属性。如果您想将其切换到XmlSerializer您可以使用以下代码(例如在您的Global.asax):

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;

当然XmlSerializer有它自己的一组限制,您需要注意这些限制。

于 2013-03-25T10:21:58.707 回答