【问题标题】:How to return JSON in an ApiController for a single method?如何在 ApiController 中为单个方法返回 JSON?
【发布时间】:2018-08-10 22:27:44
【问题描述】:

目前,我的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;

【问题讨论】:

  • 尝试返回类型JsonResult而不是HttpResponseMessage,那么你可以返回一个Json对象,像这样:return Json(model)
  • 试试这个ApiController.Ok你就做return Ok(model)
  • @RicardoPontual 是 System.Web.Mvc.JsonResult 吗?我收到了Cannot implicitly convert type 'System.Web.Http.Results.JsonResult<MyCarModel>' to 'System.Web.Mvc.JsonResult'
  • System.Web.Mvc.JsonResult,如果你的类继承自System.Web.Mvc.Controller,或者你可以维护HttpResponseMessage并使用return Request.CreateResponse(HttpStatusCode.OK, model)

标签: c# asp.net-mvc asp.net-web-api asp.net-web-api2 asp.net-apicontroller


【解决方案1】:

如果您无法进行全局更改以强制响应为 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);    
}

【讨论】:

    【解决方案2】:

    返回的是 XML 而不是 JSON,因为调用者正在请求 XML。可以使用过滤器将返回的格式强制为 JSON,该过滤器添加您需要的标头并让 MVC 解析 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 配置和序列化。

    【讨论】:

      【解决方案3】:

      对于 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;
              }
          }
      }
      
      }
      

      示例:

      【讨论】:

        【解决方案4】:

        试试这个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);
            }
        }
        

        【讨论】:

        【解决方案5】:

        可能问题出在 WebApiConfig 文件上。 在文件末尾添加这两行

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

        它在 Project/App_Start/WebApiConfig.cs 对于 asp.net MVC

        【讨论】:

          猜你喜欢
          • 2016-04-16
          • 1970-01-01
          • 2021-02-17
          • 1970-01-01
          • 2017-02-05
          • 2014-06-07
          • 2018-07-15
          • 2014-05-27
          • 2014-07-24
          相关资源
          最近更新 更多