Пользовательский атрибут, который возвращает http ответ - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь создать пользовательский атрибут в моих методах контроллера, я хочу, чтобы этот атрибут получал HTTPContext, и я хочу либо разрешить ему перейти к методу, если какое-либо условие выполнено, либо вернуть BadRequest с ErrorModel Iсоздал.

это то, как мое текущее промежуточное программное обеспечение делает это, но я хотел бы, чтобы нечто похожее в качестве атрибута выше моих методов (или даже всего класса контроллера).

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 Ответ

1 голос
/ 16 мая 2019

Вы ищете фильтр действий: 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] либо к контроллеру или действию, либо как глобальный фильтр . Например:

[MyActionFilter]
public class MyController : Controller
{
}
...