2016-11-16 20 views
0

私はASP.NET Web APIメソッドを作成しています。 Webメソッドは、Oracle Databaseの問合せに使用される4つの入力パラメータを受け入れ、JSONで結果を戻します。入力パラメータはstring型とDateTime型です。 API呼び出しは?id=123&date_in=01-JAN-16のようになります。コントローラでは、API呼び出しでIDがnullであるか、日付形式がdd-MMM-yy以外のもので、適切なエラーメッセージを返すなど、検証エラーを処理する必要があります。処理エラーASP.NET Web API

public class DataController : ApiController 
{ 
    [HttpGet] 
    public HttpResponseMessage Getdetails(string id,DateTime date_in) 
     { 
      List<OracleParameter> prms = new List<OracleParameter>(); 
      prms.Add(new OracleParameter("id", OracleDbType.Varchar2, id, ParameterDirection.Input)); 
      prms.Add(new OracleParameter("date_in", OracleDbType.Date, date_in, ParameterDirection.Input)); 
      string connStr = ConfigurationManager.ConnectionStrings["DtConnection"].ConnectionString; 
     using (OracleConnection dbconn = new OracleConnection(connStr)) 
     { 
      DataSet userDataset = new DataSet(); 
      var strQuery = "SELECT * from SAMPLE where id = :id and date_in = :date_in "; 
      var returnObject = new { data = new OracleDataTableJsonResponse(connStr, strQuery, prms.ToArray()) }; 
      var response = Request.CreateResponse(HttpStatusCode.OK, returnObject, MediaTypeHeaderValue.Parse("application/json")); 
      ContentDispositionHeaderValue contentDisposition = null; 
      if (ContentDispositionHeaderValue.TryParse("inline; filename=TGSData.json", out contentDisposition)) 
      { 
       response.Content.Headers.ContentDisposition = contentDisposition; 
      } 
      return response; 

これらの例外を処理するために別のクラスを作成する必要がありますか?回答をどのように返すべきですか?

+0

あなたはIDにnullチェックを防止するために型指定されたパラメータを使用することができます?彼らはのような何かをしようとした場合Getdetails(int型のID、日付と時刻のdate_inを)、これはASP.NETからエラーが返されますID =フラミンゴ&date_in = 01-JAN-16。エラー処理に関しては、シンプルな方法の1つは、試行/キャッチでSendAsyncを呼び出し、例外がスローされた場合に一貫したエラーメッセージを返すDelegatingHandlerを作成することです。 –

答えて

0

たちはExceptionFilterAttributeを拡張し、カスタム例外フィルタ属性を作成することができ、コード

public class DataController : ApiController 
      { 
       [HttpGet] 
       public HttpResponseMessage Getdetails(string id,DateTime date_in) 
       { 
        if(id==string.Empty || id==null) 
        { 
         return "Id Value Should not Empty or Null"; 
        } 
        if(!Regex.IsMatch(date_in, "^(([0-9])|([0-2][0-9])|([3][0- 
        1]))\-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\- 
        \d{4}$")) 
        { 
         return "Invalid Date Format"; 
        } 
        List<OracleParameter> prms = new List<OracleParameter>(); 
        prms.Add(new OracleParameter("id", OracleDbType.Varchar2, 
        id, ParameterDirection.Input)); 
        prms.Add(new OracleParameter("date_in", OracleDbType.Date, date_in, ParameterDirection.Input)); 
         string connStr = ConfigurationManager.ConnectionStrings["DtConnection"].ConnectionString; 
        using (OracleConnection dbconn = new OracleConnection(connStr)) 
        { 
         DataSet userDataset = new DataSet(); 
         var strQuery = "SELECT * from SAMPLE where id = :id and date_in = :date_in "; 
         var returnObject = new { data = new OracleDataTableJsonResponse(connStr, strQuery, prms.ToArray()) }; 
         var response = Request.CreateResponse(HttpStatusCode.OK, returnObject, MediaTypeHeaderValue.Parse("application/json")); 
         ContentDispositionHeaderValue contentDisposition = null; 
         if (ContentDispositionHeaderValue.TryParse("inline; filename=TGSData.json", out contentDisposition)) 
         { 
          response.Content.Headers.ContentDisposition = contentDisposition; 
         } 
         return response; 
      } 
      } 
+0

検証できない場合 パラメータデータ型DateTimeをStringデータ型に置き換えてください。 –

0

下に試してみてください。

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

そして、それをApiControllerで使用して、応答メッセージを返します。

[HttpGet] 
[CustomExceptionFilterAttribute] 
public HttpResponseMessage Getdetails(string id, DateTime date_in) 
{ 
     if (string.IsNullOrEmpty(id)) 
     { 
      throw new ArgumentNullException("id"); 
     } 
     //... 
} 
関連する問題