Web Api:推荐的返回json字符串的方法

我有几个已经收到必须返回给客户端的json字符串(不是对象)的服务。 目前,我正在显式创建HttpResponseMessage并将其Content属性设置为服务接收的json字符串:

 var response = Request.CreateResponse(HttpStatusCode.OK); response.Content = new StringContent(jsonUtilizadores, Encoding.UTF8, "application/json"); return response; 

现在,使用新的IHttpActionResult有更好的方法吗? 使用ContentOk方法最终用引号包装json字符串,这不是我想要的。

任何反馈?

创建自定义实现。 该框架可通过IHttpActionResult扩展。

以下创建自定义结果和扩展方法…

 public static class JsonStringResultExtension { public static CustomJsonStringResult JsonString(this ApiController controller, string jsonContent, HttpStatusCode statusCode = HttpStatusCode.OK) { var result = new CustomJsonStringResult(controller.Request, statusCode, jsonContent); return result; } public class CustomJsonStringResult : IHttpActionResult { private string json; private HttpStatusCode statusCode; private HttpRequestMessage request; public CustomJsonStringResult(HttpRequestMessage httpRequestMessage, HttpStatusCode statusCode = HttpStatusCode.OK, string json = "") { this.request = httpRequestMessage; this.json = json; this.statusCode = statusCode; } public Task ExecuteAsync(CancellationToken cancellationToken) { return Task.FromResult(Execute()); } private HttpResponseMessage Execute() { var response = request.CreateResponse(statusCode); response.Content = new StringContent(json, Encoding.UTF8, "application/json"); return response; } } } 

…然后可以应用于ApiController派生类。 大大简化以前的通话

 return this.JsonString(jsonUtilizadores); //defaults to 200 OK 

或者使用所需的HTTP状态代码

 return this.JsonString(jsonUtilizadores, HttpStatusCode.BadRequest); 

设置Web Api以返回JSON格式:

  public static void Register(HttpConfiguration config) { config.MapHttpAttributeRoutes(); // Force to ignore Request Content Type Header and reply only JSON config.Formatters.Clear(); config.Formatters.Add(new JsonMediaTypeFormatter()); var corsAttr = new EnableCorsAttribute("*", "*", "*"); config.EnableCors(corsAttr); } 

然后像这样返回响应:

  [HttpGet] [Route("{taskId}/list")] public IHttpActionResult GetTaskDocuments(string taskId) { var docs = repository.getTaskDocuments(taskId); if (docs != null) { return Ok(docs); } else { return Ok(new ResponseStatus() { Status = Constants.RESPONSE_FAIL, Message = repository.LastErrorMsg }); } } 

ResponseStatus是下一个类的地方:

  public class ResponseStatus { public string Status { get; set; } public string Message { get; set; } } 

将响应格式保留给内容协商以符合REST,客户端应该决定它想要的格式。

在您的Web API操作中,您应该返回Ok(your object) ,Web API将看到返回它的最佳格式。

如果您需要省略其他格式化程序,那么就像Nkosi建议的那样删除其他MediaTypeFormatter对象。