在ObjectResult中创建响应主体

问题描述 投票:0回答:1

我是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”创建带有异常消息的响应主体?

  1. 似乎我可以使用任何名称的属性,而不仅仅是'成功;和'错误'所以我可以这样编码:
 var myerror = new
    {
       mySuccess = false,
       myErrors = new [] { context.Exception.Message }
    };

好吗?

  1. context.ExceptionHandled = true;的目的是什么?该书说,将异常标记为防止它从MvcMiddleware传播出来。但为什么它需要阻止它传播出去?
c# .net asp.net-mvc asp.net-core
1个回答
1
投票

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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.