Skip to main content
 首页 » 编程设计

c#之Web API 中的异常处理并返回 JSON

2024年04月12日49bjzhanghao

我有一个 Web API 的 Controller ,它查询数据库并以 JSON 格式返回结果,如下所示,

    [HttpGet] 
    public HttpResponseMessage Getdetails(string ROOM, DateTime DOB_GT) 
    { 
        if (string.IsNullOrEmpty(ROOM)) 
        { 
            return Request.CreateResponse(new { error = "Input paramete cannot be Empty or NULL" }); 
        } 
 
        try 
        { 
            List<OracleParameter> prms = new List<OracleParameter>(); 
            List<string> selectionStrings = new List<string>(); 
            prms.Add(new OracleParameter("ROOM", OracleDbType.Varchar2, ROOM, ParameterDirection.Input)); 
            prms.Add(new OracleParameter("DOB_GT", OracleDbType.Date, DOB_GT, ParameterDirection.Input)); 
            string connStr = ConfigurationManager.ConnectionStrings["TBaseConnection"].ConnectionString; 
            using (OracleConnection dbconn = new OracleConnection(connStr)) 
            { 
                DataSet userDataset = new DataSet(); 
                var strQuery = "SELECT * from RESULTS_VW where ROOM = :ROOM and DOB > :DOB_GT"; 
                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=TData.json", out contentDisposition)) 
                { 
                    response.Content.Headers.ContentDisposition = contentDisposition; 
                } 
                return response; 
            } 
        } 
        catch (Exception ex) 
         {   var returnObj = new { error = ex.Message }; 
             var response = Request.CreateResponse(HttpStatusCode.BadRequest, returnObj, MediaTypeHeaderValue.Parse("application/json")); 
             ContentDispositionHeaderValue contentDisposition = null; 
             if (ContentDispositionHeaderValue.TryParse("inline; filename=error.json", out contentDisposition)) 
             { 
                 response.Content.Headers.ContentDisposition = contentDisposition; 
             } 
             return response; 
         } 
     } 
    } 

而且 API 可以完美地处理有效的查询参数。但是我试图在 API 中出现任何异常时执行错误处理,它必须返回类似 {"error":"Exception Message"} 的 JSON。在上面的代码中,我有 catch block 来处理异常。但如果有任何异常,它不会返回任何东西。请建议我一种在异常情况下构建 JSON 的简单方法。

请您参考如下方法:

使用通用响应类来简化通信模型。为此,您将拥有;

  • Generic Response 类(通用响应对象)
  • 域响应模型(包含您的逻辑的类)

见下面的代码:

  1. GenericResponse.cs

    public class GeneicResponse<T> 
    {  
        private Response(){} 
     
        public Response(T data) 
        { 
            this.Data = data; 
            this.Error = String.Empty; 
        } 
     
        public Response(Exception ex) 
        { 
            this.Data = default(T); 
            this.Error = ex.Message; 
        } 
     
        public T Data { get; set; } 
        public string Error { get; set; } 
    } 
    
  2. DomainModel.cs

    public class DomainModel 
    { 
        public int                      ID      { get; set; } 
        public string                   Name    { get; set; } 
     
     
        public DomainModel() { } 
     
        public DomainModel(int id) 
        { 
            //populate object properties from database here 
        } 
    } 
    
  3. 你的 Controller 类:

    [Route("api/myApiMethod")] 
    public Response<DomainModel> GetDetails(string ROOM, DateTime DOB_GT) 
    { 
        try 
        { 
            DomainModel myDomainModel   = new DomainModel(ROOM, DOB_GT); 
            return new Response<DomainModel>(myDomainModel); 
        } 
        catch (Exception ex) 
        { 
            return new Response<DomainModel>(ex); 
        } 
    }