Как внедрить / получить доступ к HttpContext в JsonConverter? - PullRequest
0 голосов
/ 21 мая 2018

В моем приложении ASP.NET Core 2 я хочу записать текущее имя хоста перед строкой пути каждый раз, когда объект определенного типа сериализуется (через JSON.NET).

Для этой задачиМне нужно как-то вставить HttpContext в мой пользовательский JsonConverter , чтобы получить доступ к хосту.Однако, поскольку у меня нет доступа к HttpContext в startup.cs ConfigureServices (где преобразователь зарегистрирован в MvcJsonOptions), я не знаю, как ввести HttpContext в мой JsonConverter.

1 Ответ

0 голосов
/ 22 мая 2018

Вы можете добавить сервис IHttpContextAccessor в конструктор вашего конвертера.

Что-то вроде следующего:

public class MyJsonConverter : JsonConverter
{
    private readonly IHttpContextAccessor httpContextAccessor;

    public MyJsonConverter(IHttpContextAccessor httpContextAccessor)
    {
        this.httpContextAccessor = httpContextAccessor;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var context = httpContextAccessor.HttpContext;

        //...
    }

    //...
}

Затем вы можете передать сервис HttpContextAccessor при регистрации конвертера вConfigureServices в Startup.cs

var httpContextAccessor = new HttpContextAccessor();
services.AddSingleton<IHttpContextAccessor>(httpContextAccessor);
services.AddJsonOptions(options => {
    options.SerializerSettings.Converters.Add(new MyJsonConverter(httpContextAccessor));
});

Обратите внимание, что вам не следует пытаться получить доступ к HttpContext в конструкторе преобразователя.Получите доступ к нему с помощью метода записи или чтения, так как он, скорее всего, будет вызван во время запроса, когда контекст уже был заполнен.

...