2012-09-25 26 views
8

サービスレイヤによって要求されたリソースが見つからない場合は、nullをWeb APIコントローラに返します。コントローラーでハードコーディングを行わずにクライアントに返信するHttpStatusCode.NotFoundを送信し、それがヌルであるかどうかを確認する最も良い方法は何ですか?ASP.NET Web APIとNull応答のステータスコード

+0

あなたは、コントローラのアクションメソッド内NOTFOUND状態で応答メッセージを返すことができますどちらか。例外をスローし、グローバルフィルタで例外タイプを適切なレスポンスにマップさせることもできます。私はnullをチェックすることがなぜ問題になるのかよく分かりません。コントローラーのアクションロジックは、さまざまな条件を処理し、適切なステータスコードでレスポンスにマップする必要があります。 – Oppositional

+0

私はあなたのようなグローバルフィルタを持っています。私はすべてのコントローラアクションでこれらのヌルチェックをしたくない。 –

答えて

15

個人的には、私はちょうどOppositionalのコメントに従ってコントローラーのチェックを行いますが、あなたが求めているのは完全に合理的です。

例モデル:

public class Foo 
{ 
    public string Bar { get; set; } 
} 

例コントローラー:

public class FoosController : ApiController 
{ 
    [NullObjectActionFilter] 
    public Foo Get(string id) 
    { 
     // - Returns model and 200 
     //return new Foo() { Bar = "TEST" }; 

     // - Returns 404 
     //return null; 
    } 
} 

フィルタ:

再びアクションフィルタコントローラごとに添付(またはグローバルに登録)のいずれかを使用して、あなたはこれらの線に沿って何かを行うことができます
public class NullObjectActionFilter : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 
    { 
     object outValue = null; 
     actionExecutedContext.Response.TryGetContentValue<object>(out outValue); 
     if (outValue == null) 
     { 
      throw new HttpResponseException(HttpStatusCode.NotFound); 
     } 

     base.OnActionExecuted(actionExecutedContext); 

    } 
} 
11

私はActionFilterが行く方法であることに同意します。小さな行動方法は良いにおいです。

ただし、例外が発生した場合は、HttpActionExecutedContext.Responsenullとすることができます。上記のNullObjectActionFilterクラスは、エラーHTTPステータスコードを隠す可能性があります。成功した終了と成功したHTTPコードを確認する方がよいでしょう。

ここで私が使用してアクションフィルタです:

/// <summary> 
/// Converts <c>null</c> return values into an HTTP 404 return code. 
/// </summary> 
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] 
public sealed class NullResponseIs404Attribute : ActionFilterAttribute 
{ 

    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 
    { 
     if ((actionExecutedContext.Response != null) && actionExecutedContext.Response.IsSuccessStatusCode) 
     { 
      object contentValue = null; 
      actionExecutedContext.Response.TryGetContentValue<object>(out contentValue); 
      if (contentValue == null) 
      { 
       actionExecutedContext.Response = actionExecutedContext.Request.CreateErrorResponse(HttpStatusCode.NotFound, "Object not found"); 
      } 
     } 
    } 

} 
関連する問題