嗨,我是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>"
}
}
}
答案 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;
这应该为您带来所需的结果。响应对象也必须重构。