2016-12-26 1 views
0

ASP.NET WEB API 호출을 통해 json 데이터로 개체를 반환하려고합니다.
는 내가 같은 유효한 GET 요청에이 데이터를 반환 할 수 있습니다 IHttpActionResult
GET 요청에서 개체 반환 예외 필터

{ 
    "message": "success", 
    "statuscode": "SuccessCode", 
    "statusmessage": "SuccessMsg", 
    "data": [ 
    { 
     "corrBD1": null, 
     "flagType1": null, 
     "status1": null, 
     "mstrRep1": null, 
     "repname1": null, 
     "nameAccount1": null, 
     "acDate1": "0001-01-01T00:00:00", 
     "preAddress1": null, 
     "currAddress1": null 
    }] 
} 

형태로 데이터를 반환 할 :

return OK(employee); 

하지만이있을 때 예외 내가 반환해야 발생 동일한 양식의 데이터

{ 
    "message": "fail", 
    "statuscode": "400", 
    "statusmessage": "failmsg", 
    "data": null 
} 

그러나 예외 필터는 012 형식으로 응답을 보내야합니다.(불행히도 필수 양식으로 되돌릴 수 없음) 어떻게 수행합니까?

답변

1

질문을 올바르게 이해하면 컨트롤러 또는 예외 필터에서 응답을 처리하는지 여부에 관계없이 결과에서 일관된 메시지 구문을 사용하기 만하면됩니다. 당신은 당신의 자신의 IHttpActionResult을 만들어 당신이 원하는 것을 할 수 있어야한다 : 핸들러에서

private class MyResult : IHttpActionResult 
    { 
     public HttpRequestMessage Request { get; set; } 

     public string Content { get; set; } 

     public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) 
     { 
      HttpResponseMessage response = 
       new HttpResponseMessage(HttpStatusCode.InternalServerError); // or whatever 
      response.Content = new StringContent(Content); // your content here 
      response.RequestMessage = Request; 
      return Task.FromResult(response); 
     } 
    } 

당신은 당신이 위에서 생성 한 인스턴스에 ExceptionHandlerContext.Request을 설정합니다. 그것은 당신의 시나리오에서 효과가 있습니까?

0

감사합니다. Jeremy !! 솔루션을 구현했습니다. 몇 가지 변경 작업을 수행하여 원하는 결과를 구현할 수 있습니다.
코드를 확인하고 제안 해주십시오.

public class CustomExceptionResult : IHttpActionResult 
     { 
      private HttpRequestMessage _request; 
      private HttpResponseMessage _httpResponseMessage; 


      public CustomExceptionResult(HttpRequestMessage request, HttpResponseMessage httpResponseMessage, Employee data) 
      { 
       _request = request;     

       _httpResponseMessage = request.CreateResponse(HttpStatusCode.InternalServerError, data); 

      } 

      public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) 
      { 
       return Task.FromResult(_httpResponseMessage); 
      } 
     } 


이 내 예외 핸들러 코드입니다.

public class NotFoundExceptionFilter:ExceptionFilterAttribute 
    { 

     public override void OnException(HttpActionExecutedContext context) 
     { 
      if (context.Exception is KeyNotFoundException) 
      { 
       var msg = context.Exception.Message; 
//class for creating standard Json object 
       JsonWrapper data= new JsonWrapper("There is some problem with the key you are looking for","400","Bad Request",null); 
       Controllers.NotFoundExceptionResult result = new Controllers.NotFoundExceptionResult(context.Request, data); 
       context.Response = context.Request.CreateResponse(HttpStatusCode.BadRequest, result);     
      } 
      else 
      { 
       base.OnException(context); 
      } 
     } 
    } 


나는 결과에 JSON 아래를 얻고있다 :

{ 
    "message": "There is some problem with the key you are looking for", 
    "statuscode": "400", 
    "statusmessage": "Bad request", 
    "data": null 
} 
+1

그것은 (하지 않는 한, 당신은 NotFoundExceptionResult에 필요한 일을 할 수 사용자 지정 하나가 필요합니다 그래서 확실하지 않았다처럼 보인다 그것이 당신이 후자를 만드는데 사용하는 것입니다). –

+0

감사합니다. Jeremy !! 당신 말이 맞아요. –