2016-05-23 1 views
1

私はJSON、一例として、オブジェクトを返す多くの機能していたWeb-APIがあります。ウェブAPIエラーhandelingリターンJSON

[HttpGet] 
public userDTO User(int id) 
{ 
    return dal.GetUser(id); 
} 

public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 

      config.Routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{controller}/{action}/{id}", 
       defaults: new { id = RouteParameter.Optional } 
      ); 

      var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml"); 
      config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType); 
     } 
    } 

どのように私はエラーhandelingを実装することができますか?エラーが発生した場合、JSONを返すだけです。{"エラー": "何か問題が起こった"}

クラッシュした場合、APIは500エラーを返します。

答えて

2

あなたの最良のオプションは、カスタムExceptionHandler

public class MyCustomExceptionHandler : ExceptionHandler 
{ 
    private readonly HttpConfiguration _configuration; 

    public MyCustomExceptionHandler(HttpConfiguration config){ 
     _configuration = config; 
    } 

    public override void Handle(ExceptionHandlerContext context) 
    { 
     var formatters = _configuration.Formatters; 
     var negotiator = _configuration.Services.GetContentNegotiator(); 

     context.Result = new NegotiatedContentResult<ErrorResponse>(HttpStatusCode.InternalServerError, new ErrorResponse 
      { 
       Message = context.Exception.Message, 
       CustomProperty = "Something" 
      }, negotiator, context.Request, formatters); 
    } 

    public override bool ShouldHandle(ExceptionHandlerContext context) 
    { 
     return true; //your logic if you want only certain exception to be handled 
    } 
} 

internal class ErrorResponse 
{ 
    public string Message { get; set; } 

    public string CustomProperty { get; set; } 
} 

を実装して、あなたのWebApiConfig.csファイル内に登録することです:あなたは、エラーメッセージの細かい段階的なカスタマイズがある場合には戻ってきたこの道を

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Services.Replace(typeof (IExceptionHandler), new MyCustomExceptionHandler(config)); 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{action}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

     var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml"); 
     config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType); 
    } 
} 

未処理の例外です。