2016-08-08 5 views
1

JSON API Spec修正.NET ApiController「BadResult()」印刷するカスタムJSON

に付着したメッセージは、私の目標は、

return BadRequest(someJSONErrorObject); 

または

012を使用するようにエラーが発生したとき
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}" 
} 

答えて

2

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; 
    } 
} 

カスタムを作成し、使いやすさを維持するために、通話が

return this.BadRequest(someJSONErrorObject); 

または

を望ん許可されている拡張メソッドに

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.NotFound(someJSONErrorObject); 
+0

を通じて実行されませんが、 'BadRequestは、()'コンストラクタは、文字列または状態をとります。文字列にあるものはすべて、 'Message'プロパティに割り当てられます。 – leejt489

+0

私のコードでこれを回避しました。うん、私はそれ 'this.BadRequest()'パート...その周りにどのような方法で苦しんでいた – Nkosi

+0

は見えないしましょうか? – Nkosi

0

のように見えますが、HTTPステータスとエラーメッセージを設定することができ、カスタム・エラー・クラスを作成します。カスタムエラークラスを作成して、あなたのカストムエラーメッセージを投げます。カスタム例外をjson形式で送信するグローバル例外フィルタを作成します。

+0

私の目標は、コントローラ内の例外をスローするのではなく、明示的に '()' BadRequestを返すことがありませんでした。あなたは 'BadRequestを返すときは()'それは例外フィルタこれは、 '' OK(someJSONDataObject)の作品 – leejt489

関連する問題