目前,我的ApiController
s正在返回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;
如果你不能让一个全球性的变化,迫使作为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);
}
因为调用方请求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配置,系列化的任何其他方法的方法。
也许问题是与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
对于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;
}
}
}
}
试试这个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);
}
}