要求されたリソースがサービスレイヤーによって検出されない場合、WebAPIコントローラーにnullを返します。HttpStatusCode.NotFound
コントローラにハードコーディングせずに、応答がnullかどうかを確認して、応答をクライアントに返すための最良の方法は何ですか?
7777 次
2 に答える
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);
}
}
于 2012-09-26T08:24:30.040 に答える
11
私は、ActionFilterが進むべき道であるというMarkに同意します-小さなアクションメソッドは良い匂いです。
ただし、例外HttpActionExecutedContext.Response
がnull
発生した場合もあります。また、上記の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");
}
}
}
}
于 2014-02-20T01:51:24.137 に答える