返回http响应的自定义属性

时间:2019-05-16 08:12:02

标签: c# asp.net-core attributes asp.net-core-mvc httprequest

我正在尝试在控制器方法中创建自定义属性,我希望此属性获取HTTPContext,并且我希望在某些条件为真的情况下让其继续该方法,否则返回带有ErrorModel的BadRequest已创建。

这是我当前的中间件的工作方式,但是我想在我的方法(甚至是整个控制器类)上方添加类似的属性。

if (!response.Success)
{
    context.Response.StatusCode = (int)HttpStatusCode.BadRequest;
    var errorMessageJson = JsonConvert.SerializeObject(new ErrorViewModel()
    {
        Identifier = "CPP_ERROR",
        Id = 1,
        Name = "INVALID_LOCATION",
        Description = string.IsNullOrEmpty(computerName) ? "Werkplek is onbekend." : $"Werkplek {computerName} is niet gekoppeld aan een business balie."
    });
    await context.Response.WriteAsync(errorMessageJson);
}
else
{
    context.SetWorkstation(response.Computer);
    context.SetLocation(response.Location);

    //  Call the next delegate/ middleware in the pipeline
    await _next(context);
}

有人知道如何实现这一目标吗?我已经研究了自定义授权属性,但是随后我无法控制返回的HTTPResponse。

1 个答案:

答案 0 :(得分:1)

您正在寻找动作过滤器:https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-2.2。可以使用属性将动作过滤器应用于控制器动作。例如:

public class MyActionFilterAttribute : ActionFilterAttribute
{
    public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        // Add some condition here
        if (...)
        {
            // Execute the action if the condition is true
            await next();
        }
        else
        {
            // Short-circuit the action by specifying a result
            context.Result = new BadRequestObjectResult(new ErrorViewModel
            {
                // ...
            });
        }
    }
}

您可以通过在控制器或操作上使用[MyActionFilter]属性或将其用作global filter来应用此过滤器。例如:

[MyActionFilter]
public class MyController : Controller
{
}