我有几个服务已经接收了必须返回给客户端的json字符串(而不是对象)。目前,我正在显式创建HttpResponseMessage,并将其Content属性设置为服务接收的json字符串:
var response = Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(jsonUtilizadores, Encoding.UTF8, "application/json");
return response;现在,有没有更好的方法来用新的IHttpActionResult来做到这一点呢?使用Content或Ok方法的结果是用引号将json字符串括起来,这不是我想要的。
有什么反馈吗?
发布于 2016-11-28 10:39:45
创建自定义实现。该框架可通过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;
}
}
}然后,可以将...that应用于ApiController派生类。大大简化了之前对
return this.JsonString(jsonUtilizadores); //defaults to 200 OK或使用所需的HTTP状态代码
return this.JsonString(jsonUtilizadores, HttpStatusCode.BadRequest);发布于 2016-11-28 11:56:42
设置您的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; }
}发布于 2016-11-28 13:08:58
将响应格式留给内容协商,以便与REST兼容,客户端应该决定它想要的格式。
在你的web API操作中,你应该只返回Ok(your object),web API将会看到返回它的最佳格式。
如果您需要省略其他格式化程序,则只需按照Nkosi的建议删除其他MediaTypeFormatter对象。
https://stackoverflow.com/questions/40833162
复制相似问题