Как реагировать Хорошо отформатированные ошибки как JSON - PullRequest
0 голосов
/ 08 сентября 2018

Привет, я новичок в C #, сейчас создаю свой первый веб-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;
    }

После запуска этого веб-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 голосов
/ 08 сентября 2018
        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;

Это должно дать вам желаемый результат. Объект ответа также должен быть реорганизован.

0 голосов
/ 08 сентября 2018

Требуемая модель ответа на ошибку 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...