2016-08-22 12 views
0

ASP.NET WebAPI 2を使用する場合、要求に必須フィールドが含まれていないとエラーをスローする方法はありますか?現在の動作は、欠落しているフィールドにデフォルト値を設定することです。それを変更する方法はありますか?Web API - 必要に応じてエラーコードを返します。要求に含まれていません。

Json.NETのドキュメントには、特別な設定があります。 http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_MissingMemberHandling.htm ですが、それほど大きな違いはありません。

コードサンプル:コントローラ

[HttpPost] 
    [Route("api/post-guid")] 
    public TestResponse Post(RequestWithGuid request) { 
     if(request == null) { 
      throw new HttpResponseException(HttpStatusCode.BadRequest); 
     } 
     // This check will work but I am trying to omit it 
     // with serializer settings to not put default values for missing members. 
     //if(request.id == default(Guid)) { 
     // throw new HttpResponseException(HttpStatusCode.BadRequest); 
     //} 

     return new TestResponse { 
      id = request.id 
     }; 
    } 

public class RequestWithGuid { 
    public Guid id; 
} 

答えて

1

でApp_Start

var config = GlobalConfiguration.Configuration; 

config.Formatters.JsonFormatter.SerializerSettings.MissingMemberHandling = MissingMemberHandling.Error; 

で あなたはRequiredのGuidとしてidフィールドを飾ることができます。何かのように:あなたは、検証フィルタを作成することができ、いっそ

if (!ModelState.IsValid){ 
    throw new HttpResponseException(HttpStatusCode.BadRequest); 
} 

など、すべてのメソッド飾る:あなたのコントローラメソッドで次に

public class RequestWithGuid 
{ 
    [Required] 
    public Guid id {get; set;} 
} 

、あなたはモデルを検証することができ

[HttpPost] 
[Route("api/post-guid")] 
[ValidateModel] 
public TestResponse Post(RequestWithGuid request) { 
    ... 
} 

アクションフィルタクラス:

public override void OnActionExecuting(HttpActionContext context) 
    { 
     if (context.ModelState.IsValid == false) 
     { 
      context.Response = context.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Invalid request"); 

     } 
    } 
+0

でエラーハンドラを作成しました。 }この部分は、実際に省略しようとしています。 – klashar

0

ここで私は結局何をしたのですか:

Application_Startで、不足しているメンバーはエラーとセットアップエラー処理として処理する必要があります。

var config = GlobalConfiguration.Configuration; 

config.Formatters.JsonFormatter.SerializerSettings.MissingMemberHandling = MissingMemberHandling.Error; 
config.Formatters.JsonFormatter.SerializerSettings.Error = _serializationErrorHandler; 

そして(ModelState.IsValid!){ スロー新しいHttpResponseException(HttpStatusCode.BadRequest)場合Global.asax.cs

private readonly EventHandler<ErrorEventArgs> _serializationErrorHandler = (sender, args) => { 
    _log.Error("Serialization Error", args.ErrorContext.Error); 
    throw new HttpResponseException(HttpStatusCode.BadRequest); 
}; 
+0

必須ではないフィールドを含めたくない場合があるため、APIのコンシューマにとって問題になる可能性があります。 – alltej

関連する問題