如何在ApiController返回JSON的单一方法?

问题描述 投票:6回答:5

目前,我的ApiControllers正在返回XML作为响应,但对于一个方法,我要回JSON。即我不能让一个全球性的变化,迫使响应为JSON。

public class CarController : ApiController
{  
    [System.Web.Mvc.Route("api/Player/videos")]
    public HttpResponseMessage GetVideoMappings()
    {
        var model = new MyCarModel();    
        return model;
    }
}

我试着这样做,但似乎不是我的模型转换成JSON字符串正确:

var jsonString = Json(model).ToString();    
var response = this.Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(jsonString, Encoding.UTF8, "application/json");
return response;
c# asp.net-mvc asp.net-web-api asp.net-web-api2 asp.net-apicontroller
5个回答
18
投票

如果你不能让一个全球性的变化,迫使作为JSON响应,然后尝试:

[Route("api/Player/videos")]
public HttpResponseMessage GetVideoMappings()
{
    var model = new MyCarModel();
    return Request.CreateResponse(HttpStatusCode.OK,model,Configuration.Formatters.JsonFormatter);
}

要么

[Route("api/Player/videos")]
public IHttpActionResult GetVideoMappings()
{
    var model = new MyCarModel();
    return Json(model);    
}

如果你想全局更改,然后先去YourProject/App_Start/WebApiConfig.cs并添加:

config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(
config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml"));

Register方法的底部。

然后尝试:

[Route("api/Player/videos")]
public IHttpActionResult GetVideoMappings()
{
    var model = new MyCarModel();
    return Ok(model);    
}

3
投票

因为调用方请求XML的XML返回,而不是JSON。返回的格式可以使用过滤器,增加了你所需要的头,让MVC解决JSON被迫JSON。

public class AcceptHeaderJsonAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        actionContext.Request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));    
    }
}

所以,你可以装饰你想强行与这个属性的JSON响应,并保持相同的全局JSON配置,系列化的任何其他方法的方法。


0
投票

也许问题是与WebApiConfig文件。在文件的最后添加这两条线

var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);

它是在项目/ App_Start / WebApiConfig.cs对于asp.net MVC


0
投票

对于API控制器它是由呼叫者以确定响应是如何创建的。除非你特意添加代码,迫使只有一种类型的响应。下面是一个API方法的一个简单的例子,并呼吁请求XML,或JSON时会发生什么。

public class XmlEampleController : ApiController
{
    [HttpPost]
    [ActionName("MyOrderAction")]
    public HttpResponseMessage MyOrder([FromBody]MyOder order)
    {
        if (order != null)
        {
            return Request.CreateResponse<MyOder>(HttpStatusCode.Created, order);
        }
        return Request.CreateResponse(HttpStatusCode.BadRequest);
    }

[Serializable]
public partial class MyOder
{
    private string dataField;
    public string MyData
    {
        get
        {
            return this.dataField;
        }
        set
        {
            this.dataField = value;
        }
    }
}

}

示例:Help page display


0
投票

试试这个ApiController.Ok

你只是return Ok(model)并更改返回类型IHttpActionResult

例:

public class CarController : ApiController
{
    [System.Web.Mvc.Route("api/Player/videos")]
    public IHttpActionResult GetVideoMappings()
    {
        var model = new MyCarModel();
        return Ok(model);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.