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

Lui*_*reu 7 c# asp.net-web-api2

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

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

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

任何反馈?

Nko*_*osi 10

创建自定义实现.该框架可通过以下方式扩展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<HttpResponseMessage> 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

return this.JsonString(jsonUtilizadores); //defaults to 200 OK
Run Code Online (Sandbox Code Playgroud)

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

return this.JsonString(jsonUtilizadores, HttpStatusCode.BadRequest);
Run Code Online (Sandbox Code Playgroud)

  • 我发现的最简单的答案 - 不知道为什么这不是更受欢迎.谢谢 (3认同)

Sam*_*sov 5

设置您的 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);
    }
Run Code Online (Sandbox Code Playgroud)

然后像这样返回响应:

        [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 });
        }
    }
Run Code Online (Sandbox Code Playgroud)

ResponseStatus 是下一个类:

 public class ResponseStatus
    {
        public string Status { get; set; }
        public string Message { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)