修改 .NET ApiController "BadResult()" 以打印自定义 JSON
Modify .NET ApiController "BadResult()" to print custom JSON
我正在使用 .NET 模式,其中我的控制器操作具有这样的签名
public async Task<IHttpActionResult> GetTimeSeries(string deviceId, string tag) { ... }
在控制器内部,我想发送一条遵循 JSON API Spec
的自定义错误消息
我的目标是在遇到错误时使用
return BadRequest(someJSONErrorObject);
或
return NotFound(someJSONErrorObject);
而不是抛出异常。
目前如果我这样做
return BadRequest(JsonConvert.SerializeObject(someJSONErrorObject));
我回来的JSON长得像
{
"Message": "{\"data\":null,\"errors\":[{\"detail\":\"The string was not recognized as a valid DateTime. There is an unknown word starting at index 0.\"}],\"meta\":null}"
}
创建自定义错误 class,您可以在其中设置 http 状态和错误消息。创建自定义异常 class 以抛出您的自定义错误消息。创建一个全局异常过滤器,它将以 json 格式向您发送自定义异常。
创建自定义 IHttpActionResult
public class CustomResponseResult<T> : IHttpActionResult {
public CustomResponseResult(HttpStatusCode statusCode, T content, HttpRequestMessage request) {
Content = content;
Request = request;
StatusCode = statusCode;
}
public T Content { get; private set; }
public HttpRequestMessage Request { get; private set; }
public HttpStatusCode StatusCode { get; private set; }
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) {
return Task.FromResult(Execute());
}
private HttpResponseMessage Execute() {
var response = Request.CreateResponse(StatusCode, Content);
response.RequestMessage = Request;
response.ReasonPhrase = StatusCode.ToString();
return response;
}
}
然后为了保持可用性创建扩展方法
public static class ApiControllerExtensions {
public static IHttpActionResult BadRequest<T>(this ApiController controller, T content) {
return controller.CustomResponse(HttpStatusCode.BadRequest, content);
}
public static IHttpActionResult NotFound<T>(this ApiController controller, T content) {
return controller.CustomResponse(HttpStatusCode.NotFound, content);
}
public static IHttpActionResult CustomResponse<T>(this ApiController controller, HttpStatusCode statusCode, T content) {
var request = controller.Request;
var result = new CustomResponseResult<T>(statusCode, content, request);
return result;
}
}
允许来电
return this.BadRequest(someJSONErrorObject);
或
return this.NotFound(someJSONErrorObject);
我正在使用 .NET 模式,其中我的控制器操作具有这样的签名
public async Task<IHttpActionResult> GetTimeSeries(string deviceId, string tag) { ... }
在控制器内部,我想发送一条遵循 JSON API Spec
的自定义错误消息我的目标是在遇到错误时使用
return BadRequest(someJSONErrorObject);
或
return NotFound(someJSONErrorObject);
而不是抛出异常。
目前如果我这样做
return BadRequest(JsonConvert.SerializeObject(someJSONErrorObject));
我回来的JSON长得像
{
"Message": "{\"data\":null,\"errors\":[{\"detail\":\"The string was not recognized as a valid DateTime. There is an unknown word starting at index 0.\"}],\"meta\":null}"
}
创建自定义错误 class,您可以在其中设置 http 状态和错误消息。创建自定义异常 class 以抛出您的自定义错误消息。创建一个全局异常过滤器,它将以 json 格式向您发送自定义异常。
创建自定义 IHttpActionResult
public class CustomResponseResult<T> : IHttpActionResult {
public CustomResponseResult(HttpStatusCode statusCode, T content, HttpRequestMessage request) {
Content = content;
Request = request;
StatusCode = statusCode;
}
public T Content { get; private set; }
public HttpRequestMessage Request { get; private set; }
public HttpStatusCode StatusCode { get; private set; }
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) {
return Task.FromResult(Execute());
}
private HttpResponseMessage Execute() {
var response = Request.CreateResponse(StatusCode, Content);
response.RequestMessage = Request;
response.ReasonPhrase = StatusCode.ToString();
return response;
}
}
然后为了保持可用性创建扩展方法
public static class ApiControllerExtensions {
public static IHttpActionResult BadRequest<T>(this ApiController controller, T content) {
return controller.CustomResponse(HttpStatusCode.BadRequest, content);
}
public static IHttpActionResult NotFound<T>(this ApiController controller, T content) {
return controller.CustomResponse(HttpStatusCode.NotFound, content);
}
public static IHttpActionResult CustomResponse<T>(this ApiController controller, HttpStatusCode statusCode, T content) {
var request = controller.Request;
var result = new CustomResponseResult<T>(statusCode, content, request);
return result;
}
}
允许来电
return this.BadRequest(someJSONErrorObject);
或
return this.NotFound(someJSONErrorObject);