如何将格式正确的错误响应为JSON

时间:2018-09-08 13:57:25

标签: c# json asp.net-web-api

嗨,我是C#的新手,我正在构建我的第一个Web API。要求是以JSON格式显示作为响应发生的任何错误

这是我的ResponseData类

public class ResponseData 
{
    public List<AccountDTO> AccountList { set; get; }
    public string ReturnMessage { set; get; }
    public string error { get; set; }
    public string code { get; set; }
    public string message { get; set; }
    public string innererror { get; set; }
    public string type { get; set; }
    public string stacktrace { get; set; }

}

这是我的控制人

作为示例,如果我的代码执行catch块,我将收集异常的所有信息,并以格式化的JSON返回。

[HttpGet]
    public ResponseData getAllAccounts(string BRN, string CompanyName)
    {

        ResponseData response = new ResponseData();
        List<AccountDTO> accountlist = null;
        IAccountInterface usecase = new AccountDAO();
        try
        {
            if (BRN != null && CompanyName != null)
            {
                accountlist = usecase.getAccountbyBRNCompanyName().Where(p => p.BRN.ToLower().Equals(BRN.ToLower()) && p.CompanyName.ToLower().Contains(CompanyName.ToLower())).ToList();
                response.ReturnMessage = "Data filter by BRN and CompanyName.";
            }

            else
            {
                response.ReturnMessage = "Data filter cannot be null.";
            }
            response.AccountList = accountlist;
        }
        catch (Exception e)
        {
            Console.WriteLine("Error: " + e.Message + ", Stack: " + e.StackTrace);
            response.code = "sample code";
            response.message = e.Message;
            response.innererror = "{";
            response.message = e.Message;
            response.type = "ExceptionType + ...";
            response.stacktrace = e.StackTrace;



            //response.ReturnMessage = JsonConvert.SerializeObject(errorFormat);


        }

        return response;
    }

运行该Web APi后,如果执行catch块,则响应如下图所示。 enter image description here 到目前为止,它几乎类似于我想要的。但是,无论是否有错误,我的WEB API响应都将采用这种格式。我知道这是因为我返回了response object,所以将显示所有对象属性。

这是我想要实现的示例响应。有关错误的详细信息作为JSON包含在响应中。错误将采用这种格式。任何帮助和指导都将不胜感激。

{  
 "error":{  
  "code": "<This code is not related to..>",  
  "message": "<A message describing the error..>",  
  "innererror": {  
   "message": "<A message describing the error..>",  
   "type": "Microsoft.Crm.CrmHttpException",  
   "stacktrace": "<Details from the server about where the 
                  error occurred>"  
    }  
   }  
}

2 个答案:

答案 0 :(得分:0)

所需的JSON错误响应模型与使用的类不匹配。

当前的对象模型承担着多种责任。

考虑重构类模型以承担单个责任

public class ResponseData {
    public List<AccountDTO> AccountList { set; get; }
    public string ReturnMessage { set; get; }
}

还可以将API动作重构为基于该动作的流程返回适当的响应。

[HttpGet]
public IHttpActionResult getAllAccounts(string BRN, string CompanyName) {
    try {
        ResponseData response = new ResponseData();
        List<AccountDTO> accountlist = null;
        IAccountInterface usecase = new AccountDAO();
        if (BRN != null && CompanyName != null) {
            accountlist = usecase.getAccountbyBRNCompanyName().Where(p => p.BRN.ToLower().Equals(BRN.ToLower()) && p.CompanyName.ToLower().Contains(CompanyName.ToLower())).ToList();
            response.ReturnMessage = "Data filter by BRN and CompanyName.";
        } else {
            response.ReturnMessage = "Data filter cannot be null.";
        }
        response.AccountList = accountlist;
        return Ok(response);
    }
    catch (Exception e) {
        Console.WriteLine("Error: " + e.Message + ", Stack: " + e.StackTrace);
        var response = new {
            error = new {
                code = "sample code",
                message = e.Message,
                innererror = new {
                    message = e.Message,
                    type = e.GetType().Name,
                    stacktrace = e.StackTrace
                }
            }
        }
        var responseMessage = Request.CreateResponse(HttpStatusCode.InternalServerError, response);
        return ResponseMessage(responseMessage);
    }
}

答案 1 :(得分:0)

        Console.WriteLine("Error: " + e.Message + ", Stack: " + e.StackTrace);
        response.error.code = "sample code";
        response.error.message = e.Message;
        response.error.innererror = "{";
        response.error.message = e.Message;
        response.error.type = "ExceptionType + ...";
        response.error.stacktrace = e.StackTrace;

这应该为您带来所需的结果。响应对象也必须重构。