2017-01-24 9 views
3

Web API 2では、レスポンスのステータスで例外メッセージを直接返すことは可能ですか?私は、WCFサービスを(というにWeb Intelligence APIより)書いていた場合Web API 2サービス - ステータスで例外メッセージを返す方法

例えば、私は直接応答ステータスの一部として例外メッセージを返すようにthis tutorialに従うことができる:ここでは、

enter image description here

Webサービスは応答内のデータを返しません。また、エラーメッセージはStatus Descriptionで直接返されます。

これは、例外が発生したときの私のWeb APIサービスの動作を丁寧に説明していますが、これを行う方法を考えることができません。

多くの提案は、以下のようなコードを使用することを推奨しますが、エラーメッセージは、ステータスの一部ではなく、別の応答文字列で返されます。例えば

私はこのコードを使用した場合、:

public IHttpActionResult GetAllProducts() 
{ 
    try 
    { 
     // Let's get our service to throw an Exception 
     throw new Exception("Something went wrong"); 

     return Ok(products); 
    } 
    catch (Exception ex) 
    { 
     return new System.Web.Http.Results.ResponseMessageResult(
      Request.CreateErrorResponse((HttpStatusCode)500, 
       new HttpError("Something went wrong"))); 
    } 
} 

を...それは一般的な500のメッセージを返し、例外はJSON文字列で返されます。

enter image description here

誰もがこれを行うには(IHttpActionResultオブジェクトを返す)のWeb API機能を変更する方法を知っていますか?

答えて

1

すべての例外を処理するカスタムグローバルフィルタを登録できます。ような何か:

public class CatchAllExceptionFilterAttribute : ExceptionFilterAttribute 
{ 
    public override void OnException(HttpActionExecutedContext context) 
    { 
     context.Response = new HttpResponseMessage(HttpStatusCode.InternalServerError) 
     { 
      Content = new StringContent(context.Exception.Message) 
     }; 
    } 
} 

あなたがして、WebApiConfig.csに登録する必要があります。

config.Filters.Add(new CatchAllExceptionFilterAttribute()); 

このフィルタは、システム内の未処理の例外がある毎回ヒットとするHTTPレスポンスを設定されます。例外メッセージさまざまな種類の例外をチェックし、それに応じて応答を変更することもできます。

public override void OnException(HttpActionExecutedContext context) 
    { 
     if(context.Exception is NotImplementedException) 
     { 
      context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented) 
      { 
       Content = new StringContent("Method not implemented.") 
      }; 
     } 
     else 
     { 
      context.Response = new HttpResponseMessage(HttpStatusCode.InternalServerError) 
      { 
       Content = new StringContent(context.Exception.Message) 
      }; 
     } 

    } 
関連する問題