【问题标题】:How to response Well formatted errors as JSON如何将格式正确的错误响应为 JSON
【发布时间】:2018-09-08 13:57:25
【问题描述】:

您好,我是 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 块,则响应如下图所示。 到目前为止,它几乎与我想要的相似。但是,无论错误与否,我的 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>"  
    }  
   }  
}

【问题讨论】:

  • 所需的 JSON 错误响应模型与使用的类不匹配。
  • @Nkosi 请详细说明。

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


【解决方案1】:

所需的 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);
    }
}

【讨论】:

  • Tqsm @NKosi,帮助实现我想要的。我会接受这个作为答案。
【解决方案2】:
        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;

这应该会得到您想要的结果。响应对象也必须重构。

【讨论】:

  • 感谢@NewfrontSolutions,但 response.error 没有这样的属性。我怎样才能重构这个对象?
猜你喜欢
  • 1970-01-01
  • 2023-04-03
  • 2016-05-20
  • 2017-09-11
  • 2015-12-02
  • 1970-01-01
  • 2022-08-16
  • 2011-08-22
  • 2016-07-23
相关资源
最近更新 更多