Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Как получить HttpRequest в AspNet Core в произвольной точке выполнения ? / 15 сообщений из 15, страница 1 из 1
06.12.2019, 15:49
    #39899175
WaspNewCore
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить HttpRequest в AspNet Core в произвольной точке выполнения ?
Для целей логгирования мне нужно в произвольном методе получить доступ к HttpRequest и считать его Headers, часть из которых мне нужно залогировать.

Есть ли какое-то глобальное, статическое свойство для этого ?
Не очень хочется протягивать это свойство через все вызовы методов.
...
Рейтинг: 0 / 0
06.12.2019, 16:14
    #39899191
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить HttpRequest в AspNet Core в произвольной точке выполнения ?
Инжектишь IHttpContextAccessor . Но использовать это где-то кроме, например, MVC-контроллеров совершенно трефно.
...
Рейтинг: 0 / 0
07.12.2019, 02:58
    #39899337
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить HttpRequest в AspNet Core в произвольной точке выполнения ?
WaspNewCore,

ваще это нужно делать в промежуточном слое, а не в "произвольном методе" -- такие подходы нужно уже давно похоронить )

https://docs.microsoft.com/ru-ru/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.1
...
Рейтинг: 0 / 0
07.12.2019, 02:59
    #39899338
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить HttpRequest в AspNet Core в произвольной точке выполнения ?
WaspNewCore,

вот чуть устаревший, но фактически рабочий примерчик

https://exceptionnotfound.net/using-middleware-to-log-requests-and-responses-in-asp-net-core/
...
Рейтинг: 0 / 0
09.12.2019, 11:48
    #39899864
WaspNewCore
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить HttpRequest в AspNet Core в произвольной точке выполнения ?
hVostt
WaspNewCore,

ваще это нужно делать в промежуточном слое, а не в "произвольном методе" -- такие подходы нужно уже давно похоронить )

https://docs.microsoft.com/ru-ru/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.1



Ситуация простая - логгирование выполнения некоего алгоритма: "Зашли в функцию 1 с такими то параметрами", "вызвали метод такой то", "получили ответ от сервиса. ой, а это не хороший ответ"
Это не реализовать через промежуточный слой - в промежуточном слое это все один единственный вызов.
Код: c#
1.
2.
3.
4.
5.
6.
public Task DoSomething (MyParams myParams)
{
  _logger.LogInput (myParams)  // caller null
  ...
  _logger.LogInfo("Что то сделали. Информация из заголовков {Headers[""]}")   << Как тут получить доступ к хедерам ?
}



Как это можно реализовать ?
...
Рейтинг: 0 / 0
09.12.2019, 12:47
    #39899902
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить HttpRequest в AspNet Core в произвольной точке выполнения ?
WaspNewCore
Ситуация простая - логгирование выполнения некоего алгоритма: "Зашли в функцию 1 с такими то параметрами", "вызвали метод такой то", "получили ответ от сервиса. ой, а это не хороший ответ"
Это не реализовать через промежуточный слой - в промежуточном слое это все один единственный вызов.

Как это можно реализовать ?

А накука для этого вообще HttpContext? В невебовских приложениях, по-твоему, логирование через HttpContext (которого там вообще нет) делают? Инжекть просто свой логгер в тот компонент, где тебе логирование надо, вот и все. Но, вообще, это по-хорошему следует делать через DI interception (я, правда, не в курсе, есть ли он в виде какого-нибудь плагина для "базового" коровского DI, или нет). Автофак, например, его умеет.
...
Рейтинг: 0 / 0
09.12.2019, 13:04
    #39899920
WaspNewCore
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить HttpRequest в AspNet Core в произвольной точке выполнения ?
Ладно ок. Сделал scoped сервис, который инжекчу в логгер.
Также инжекчу этот сервис в IAsyncResourceFilter, который считывает хэдеры и передает нужные значения в этот сервис.

Думаю это правильное решение.
...
Рейтинг: 0 / 0
09.12.2019, 13:11
    #39899924
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить HttpRequest в AspNet Core в произвольной точке выполнения ?
WaspNewCore
Ситуация простая - логгирование выполнения некоего алгоритма: "Зашли в функцию 1 с такими то параметрами", "вызвали метод такой то", "получили ответ от сервиса. ой, а это не хороший ответ"
Это не реализовать через промежуточный слой - в промежуточном слое это все один единственный вызов.


Это разные записи в лог.
Журналирование HTTP запроса -- это middleware
Далее, запись в журнал остальных событий через ILogger.

То, что вы делаете -- это неправильно:

WaspNewCore
Код: c#
1.
_logger.LogInfo("Что то сделали. Информация из заголовков {Headers[""]}")   << Как тут получить доступ к хедерам ?



Вы всё смешали в кучу, и обязательно огребёте.

Отдельно журналируете HTTP запрос, со всеми заголовками и т.д.
ASP.NET Core добавляет в контекст сквозной идентификатор запроса RequestId, который будет добавлен в каждую запись журнала в рамках запроса. Так вы сможете найти все свои заголовки и вообще всю поднаготную.


WaspNewCore
Ладно ок. Сделал scoped сервис, который инжекчу в логгер.
Также инжекчу этот сервис в IAsyncResourceFilter, который считывает хэдеры и передает нужные значения в этот сервис.

Думаю это правильное решение.



Нет. Неправильное.
...
Рейтинг: 0 / 0
09.12.2019, 14:10
    #39899996
WaspNewCore
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить HttpRequest в AspNet Core в произвольной точке выполнения ?
hVostt,

Но мне нужно при логгировании бизнес логики прицепить аттрибут из заголовка Http запроса. А вы мне про то, что я айду эту информацию в логах. Мне для этого придется сводить логи Http вызовов и бизнес логов. А я хочу, чтобы эта информация была в одной строчке. Чтобы читать было удобно.
Для этого, как выше написал, сделал scoped сервис.
...
Рейтинг: 0 / 0
09.12.2019, 15:30
    #39900074
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить HttpRequest в AspNet Core в произвольной точке выполнения ?
WaspNewCore,

а для чего все это? Отладить работу программы?
...
Рейтинг: 0 / 0
09.12.2019, 15:53
    #39900112
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить HttpRequest в AspNet Core в произвольной точке выполнения ?
WaspNewCore
Для этого, как выше написал, сделал scoped сервис.

Ты потом задолбешься дебажить, когда совершенно случайно заинжектишь его не туда куда надо. Все, что не "транзиент" должно использоваться только по очень реальной нужде и с большой осторожностью.
...
Рейтинг: 0 / 0
09.12.2019, 16:00
    #39900122
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить HttpRequest в AspNet Core в произвольной точке выполнения ?
WaspNewCore
Но мне нужно при логгировании бизнес логики прицепить аттрибут из заголовка Http запроса.

Ты можешь подетальней объяснить для чего? Если у тебя HTTP заголовок как-то учавствует в БЛ, то контроллер должен сам его оттуда извлечь (лучше всего с помощью FromHeader(Name="bla-bla-bla") ) и передать его в БЛ, например, параметром. А там уже делай с ним что хочешь - хоть логгируй, хоть на принтер выводи.
...
Рейтинг: 0 / 0
09.12.2019, 17:12
    #39900237
WaspNewCore
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить HttpRequest в AspNet Core в произвольной точке выполнения ?
fkthat
WaspNewCore
Но мне нужно при логгировании бизнес логики прицепить аттрибут из заголовка Http запроса.

Ты можешь подетальней объяснить для чего? Если у тебя HTTP заголовок как-то учавствует в БЛ, то контроллер должен сам его оттуда извлечь (лучше всего с помощью FromHeader(Name="bla-bla-bla") ) и передать его в БЛ, например, параметром. А там уже делай с ним что хочешь - хоть логгируй, хоть на принтер выводи.


Все верно. В хедере передается часть данных из бизнес логики.
Вы предлагаете мне проталкивать это одно свойство через весь стек вызовов, чтобы я могу где то там на 15-ом уровне одного из сервисов залогировать его ? Кхм...

Он важен для бизнес логики, он используется. Я решил, что лучше записывать его в scoped сервис. Чем он вам не нравится ? Это же стандартная реализация DI. Понятно, что его его можно будет инжектить только в другие такие же scoped сервисы - меня это устраивает.
...
Рейтинг: 0 / 0
09.12.2019, 17:41
    #39900286
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить HttpRequest в AspNet Core в произвольной точке выполнения ?
WaspNewCore
hVostt,

Но мне нужно при логгировании бизнес логики прицепить аттрибут из заголовка Http запроса. А вы мне про то, что я айду эту информацию в логах. Мне для этого придется сводить логи Http вызовов и бизнес логов. А я хочу, чтобы эта информация была в одной строчке. Чтобы читать было удобно.
Для этого, как выше написал, сделал scoped сервис.


ну ок. нужно так нужно.
вы спрашивали, как правильно, я ответил :)
логи желательно делать более универсальными, чтобы можно было отвечать на вопросы, которых вы сейчас не знаете, с большим охватом.

вы увязываете конкретную запись лога с конкретным значением заголовка, а как он у вас используется?
не извлекается ли значение заголовка в какое-то поле, откуда и надо читать?

плохо, что вы обращаетесь по сути к RAW значению из кода логики.
...
Рейтинг: 0 / 0
09.12.2019, 17:42
    #39900288
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить HttpRequest в AspNet Core в произвольной точке выполнения ?
WaspNewCore,

т.е. получается, что ради логов, вы протащили детали реализации.
что несомненно и 100% плохо.

ту же задачу не так решать надо.
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Как получить HttpRequest в AspNet Core в произвольной точке выполнения ? / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]