Создать тело ответа в ObjectResult - PullRequest
0 голосов
/ 05 апреля 2019

Я новичок в ASP.NET Core, просто вопрос по ObjectResult.Я видел код, подобный этому:

public override void OnException(ExceptionContext context)
 {
    var myerror = new
    {
       Success = false,
       Errors = new [] { context.Exception.Message }
    };
    context.Result = new ObjectResult(myerror)
    {
        StatusCode = 500
    };
    context.ExceptionHandled = true;
    ...
 }

мои вопросы:

1 - это свойство «Ошибки» анонимного типа объекта «myerror», создающее тело ответа с сообщением об исключении?

Кажется, что я могу использовать любые имена для свойств, а не только «Успех;и «Ошибки», поэтому я могу кодировать как:
 var myerror = new
    {
       mySuccess = false,
       myErrors = new [] { context.Exception.Message }
    };

это нормально?

Какова цель выполнения context.ExceptionHandled = true;?В книге говорится, что исключение помечено как обработанное, чтобы предотвратить его распространение из MvcMiddleware.Но почему это нужно для предотвращения распространения?

1 Ответ

1 голос
/ 11 апреля 2019

1) Да.

2) Да, все в порядке. Вы можете создавать объекты любой структуры, а не только анонимные.

public class ErrorModel
{
    public string Error { get; set; }

    public int Id { get; set; }

    public List<int> Values { get; set; }
}

//filter

var error = new ErrorModel
{
    Error = context.Exception.Message,
    Id = 1,
    Values = new List<int> { 1, 2, 3 }
};
context.Result = new ObjectResult(error)
{
    StatusCode = 500
};

3) Возможно, в вашем приложении имеется несколько фильтров исключений, и если вы не установите ExceptionHandled на true во время обработки исключения, тогда будет вызван каждый фильтр и Result будет переопределен. Цель этого свойства - указать, что определенный фильтр был в состоянии справиться с исключением, и нет необходимости запускать другие фильтры исключений. Это полезно в сценарии, когда фильтр может обрабатывать только определенные типы исключений.

//handles only exceptions caused by dividing by zero
public class DivideByZeroExceptionFilterAttribute : Attribute, IExceptionFilter
{
    public void OnException(ExceptionContext context)
    {
        //chech if this is divide by zero exception
        if (!(context.Exception is DivideByZeroException))
            return;

        var myerror = new
        {
            result = false,
            message = "Division by zero went wrong"
        };
        context.Result = new ObjectResult(myerror)
        {
            StatusCode = 500
        };

        //set "handled" to true since exception is already property handled
        //and there is no need to run other filters
        context.ExceptionHandled = true;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...