2

我正在将 Web 服务迁移到 ASP.NET Web Api 2,并且几乎在第一个障碍中遇到了麻烦。

我想做这个:

public class SomeController : ApiController
{
    [Route("some\url")]
    public object Get()
    {
        return { Message = "Hello" };
    }
}

并且能够向服务询问“application/json”或“application/xml”(或实际上任何其他潜在格式,例如 Message Pack),并获得序列化响应。但它似乎只适用于 JSON。

我已经阅读了这篇文章并看到了文档,其中明确指出该框架无法将匿名类型序列化为 XML(严重),并且解决方案是不使用 XML(严重)。

当我尝试调用它并请求 XML 作为响应类型时,我得到

The 'ObjectContent`1' type failed to serialize the response body for content type 'application/xml; charset=utf-8'.

我不会取消对想要请求 XML 的客户的支持——但我真的找不到解决这个问题的方法——我能做什么?

编辑

我已经添加了这些:

System.Web.Http.GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
config.Formatters.Insert(0, new System.Net.Http.Formatting.JsonMediaTypeFormatter());
config.Formatters.Insert(0, new System.Net.Http.Formatting.XmlMediaTypeFormatter());

根据Dalorzo的回答,但这没有什么区别。

为澄清起见,当我application/json使用application/xml.

4

4 回答 4

4

您有 3 个选项:

  1. 创建一个具有正确名称的类并返回对象而不是匿名类型。
  2. 或者如果你想返回匿名实例,你应该删除 XML 格式化程序,因为 XML 格式化程序不支持匿名类型

  3. 创建您自己的继承自MediaTypeFormatterBufferedMediaTypeFormatter的格式化程序

于 2014-05-19T21:36:16.493 回答
2

您可以通过以下代码来做到这一点:

public HttpResponseMessage GetTestData()
        {        
               var testdata = (from u in context.TestRepository.Get().ToList()                            
                            select
                                 new Message
                                 {
                                     msgText = u.msgText                                    
                                 });    
                return ActionContext.Request.CreateResponse(HttpStatusCode.OK, testdata);
        }
于 2014-05-20T07:05:34.473 回答
0
// This Code Is Used To Change Contents In Api
public HttpResponseMessage GetAllcarDetails( string formate)
{
    CarModel ST = new CarModel();
    CarModel ST1 = new CarModel();
    List<CarModel> li = new List<CarModel>();

    ST.CarName = "Maruti Waganor";
    ST.CarPrice = 400000;
    ST.CarModeles = "VXI";
    ST.CarColor = "Brown";

    ST1.CarName = "Maruti Swift";
    ST1.CarPrice = 500000;
    ST1.CarModeles = "VXI";
    ST1.CarColor = "RED";

    li.Add(ST);
    li.Add(ST1);
    // return li;

    this.Request.Headers.Accept.Add(
      new MediaTypeWithQualityHeaderValue("application/xml"));
      //For Json Use "application/json"

    IContentNegotiator negotiator =
        this.Configuration.Services.GetContentNegotiator();

    ContentNegotiationResult result = negotiator.Negotiate(
        typeof(List<CarModel>), this.Request, this.Configuration.Formatters);

    if (result == null) {
        var response = new HttpResponseMessage(HttpStatusCode.NotAcceptable);
        throw new HttpResponseException(response);
    }

    return new HttpResponseMessage() {
        Content = new ObjectContent<List<CarModel>>(
            li,             // What we are serializing 
            result.Formatter,           // The media formatter
            result.MediaType.MediaType  // The MIME type
        )
    };
}  
于 2015-05-27T12:38:43.887 回答
0

请在 Chrome 上浏览您的 API 路由。Chrome 默认以 XML 格式显示输出。如果这没有发生,则意味着您的服务正在阻止使用媒体格式的 XML 格式。

在这种情况下,您应该搜索您的 WebApiConfig。如果那里什么都没有,请将此文件添加到您的项目中

using System.Net.Http.Formatting;
using System.Collections.Generic;
using System.Net.Http;
using System;
using System.Linq;
using System.Net.Http.Headers;
namespace ExampleApp.Infrastructure
{
    public class CustomNegotiator : DefaultContentNegotiator
    {
        public override ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters)
        {
            if(request.Headers.UserAgent.Where(x=>x.Product!=null&& x.Product.Name.ToLower().Equals("chrome")).Count() > 0)
            {
                return new ContentNegotiationResult(new JsonMediaTypeFormatter(), new MediaTypeHeaderValue("application/xml"));
            }
            else
            {
                return base.Negotiate(type, request, formatters);
            }
        }
    }
}

并且,在 中WebApiConfig.cs,添加:

config.Services.Replace(typeof(IContentNegotiator), new CustomNegotiator());
于 2015-12-25T18:39:52.507 回答