public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext context) { var modelState = context.ModelState; if (modelState.IsValid) { base.OnActionExecuting(context); } else { // build a json string int i = 0; StringBuilder sbErrors = new StringBuilder("{"); foreach (KeyValuePair<string, ModelState> keyValue in modelState) { string fieldName = keyValue.Key; string[] values = keyValue.Value.Errors.Select(e => e.ErrorMessage).ToArray<string>(); if (values.Length == 0 || String.IsNullOrWhiteSpace(values[0])) { continue; } int postion = fieldName.IndexOf("."); if (postion > -1) { fieldName = fieldName.Substring(postion + 1, fieldName.Length - postion - 1); } // key is property name and value is the error message, // e.g:{"key1":"[\"v1\",\"v2\"]","key2":"[\"v1\",\"v2\"]"} if (i > 0) sbErrors.Append(","); sbErrors.Append("\""); sbErrors.Append(fieldName); sbErrors.Append("\":"); sbErrors.Append("["); if (values != null && values.Length > 0) { for (int j = 0; j < values.Length; j++) { if (j > 0) sbErrors.Append(","); sbErrors.Append("\"").Append(values[j]).Append("\""); } } sbErrors.Append("]"); i++; } sbErrors.Append("}"); string message = "invalid request data."; context.Response = new HttpResponseMessage(HttpStatusCode.BadRequest); var error = new WSErrorResponse(HttpStatusCode.BadRequest, Errors.data_validation_error_400,message, sbErrors.ToString()); context.Response = HttpResponseHelper.BuildErrorResponse(error); } }
public static HttpResponseMessage BuildErrorResponse(WSErrorResponse response) { var responseMessage = new HttpResponseMessage(ConvertToStatusCode(response.Status)); responseMessage.Content = new ObjectContent(typeof(WSErrorResponse), response, new JsonMediaTypeFormatter()); responseMessage.Headers.Add(ResponseHeaderConstants.X_Error_Message, RemoveInvalidNewLine(response.Message)); return responseMessage; }
public static Task<HttpResponseMessage> SendAsync(WSErrorResponse response) { return Task<HttpResponseMessage>.Factory.StartNew(() => { var responseMessage = new HttpResponseMessage(ConvertToStatusCode(response.Status)); responseMessage.Content = new ObjectContent(typeof(WSErrorResponse), response, new JsonMediaTypeFormatter()); responseMessage.Headers.Add(ResponseHeaderConstants.X_Error_Message, RemoveInvalidNewLine(response.Message)); return responseMessage; }); }
private WSErrorResponse UnAuthenticationResponse() { WSErrorResponse unauth = new WSErrorResponse { Code = Errors.invalid_token_401, Message = "未经授权的访问!", Status = 401 }; return unauth; }
public override void OnException(HttpActionExecutedContext context) { WSErrorResponse error = new WSErrorResponse { Message = context.Exception == null? null : context.Exception.Message, More = context.Exception == null? null : context.Exception.ToString() }; if (context.Exception is BadRequestException) { error.Status = (int)HttpStatusCode.BadRequest; if (String.IsNullOrWhiteSpace(error.Code)) { error.Code = Errors.bad_request_400; } } else if (context.Exception is DuplicateObjectException) { error.Status = (int)HttpStatusCode.BadRequest; if (String.IsNullOrWhiteSpace(error.Code)) { error.Code = Errors.record_has_existed_400; } } else if (context.Exception is UnauthorizedException) { error.Status = (int)HttpStatusCode.Unauthorized; if (String.IsNullOrWhiteSpace(error.Code)) { error.Code = Errors.unauthorized_401; } } else if (context.Exception is ForbiddenException) { error.Status = (int)HttpStatusCode.Forbidden; if (String.IsNullOrWhiteSpace(error.Code)) { error.Code = Errors.forbidden_403; } } else if (context.Exception is NotFoundException) { error.Status = (int)HttpStatusCode.NotFound; { error.Code = Errors.not_found_404; } } else if (context.Exception is MobileException) { error.Status = (int)HttpStatusCode.InternalServerError; /* * This is a temporary solution. * There is a kind of error, says EMSE Script error, which does not impact the process. * The JSON response should indicate it via the code field. //*/ var exception = context.Exception as MobileException; if (exception != null) { error.Code = exception.ErrorCode; } if (String.IsNullOrWhiteSpace(error.Code)) { error.Code = Errors.internal_server_error_500; } } else { error.Status = (int)HttpStatusCode.InternalServerError; error.Code = Errors.internal_server_error_500; } context.Response = HttpResponseHelper.BuildErrorResponse(error); }