Используйте HttpRequest в контексте проверки - PullRequest
0 голосов
/ 22 октября 2018

в .net Framework <= 4.7.2, в контексте проверки вы можете получить текущий <code>HttpRequest, обратившись к HttpContext.

Например, у меня был фрагмент кода, который выглядел какthis:

public sealed class AccessValidator : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext context)
    {
        // validate stuff, if all true -> yield ok.

        // if is not valid
        var request = HttpContext.Current.Request;

        // store/log the request payload.
    }

}

Этого нельзя сделать при использовании .net Core 2.1.Я видел пост, касающийся внедрения IHttpContextAccessor или чего-то еще, но он выставляет запрос почти в каждом месте.

Поскольку это внешняя библиотека для моего сервера, я не хочу полагаться на инъекции кода сервера, потому что тогдаэто создает зависимость, которой я не хочу быть.

Есть ли какой-нибудь известный способ справиться с этим или с этим?

1 Ответ

0 голосов
/ 22 октября 2018

Этого можно добиться с помощью комбинации IHttpContextAccessor и ValidationContext.GetService.Вот как это будет выглядеть:

protected override ValidationResult IsValid(object value, ValidationContext context)
{
    // validate stuff, if all true -> yield ok.

    // if is not valid
    var httpContextAccessor = (IHttpContextAccessor)context.GetService(typeof(IHttpContextAccessor));
    var request = httpContextAccessor.HttpContext.Request;

    // store/log the request payload.
}

Вместо того, чтобы использовать внедрение зависимостей, он использует шаблон локатора служб ( считается anti -pattern , но это можетбудьте здесь единственным реальным вариантом).

Вам также необходимо настроить IHttpContextAccessor с контейнером DI в Startup.ConfigureServices, например:

services.AddHttpContextAccessor();
...