#c# #.net-core #asp.net-core-webapi #audit.net
Вопрос:
При использовании аудита.Сеть в WebAPI область создается для каждого события действия контроллера, и когда мы добавляем пользовательские поля, они отображаются на корневом уровне в json. Но когда мы создаем область аудита вручную, и если вы добавляете какие-либо пользовательские поля в область аудита, они вложены в тег «пользовательские поля». Не уверен, почему такое поведение отличается как для создания типа области, так и для создания.
Смотрите пример ниже: Это генерируется auditscope, созданным при вызове действия на контроллере: AuditInfo добавляется через auditScope.SetCustomField("AuditInfo",auditInfo);
{
"EventType": "TestEvent",
"Environment": {
"DomainName": "IIS APPPOOL",
},
"Action": {
"ActionParameters": {
}
},
"RequestBody": {
"Type": "application/json",
"Length": 3191
},
"Headers": {
},
"ResponseHeaders": {
}
},
"AuditInfo": {
"UserIdentifier": "",
"ClaimType": "iss",
"AuditType": 0
},
"id": "",
"_ts": 1627916814
}
Ниже json создается, когда я создал AuditScope вручную, используя AuditScope.CreateAsync
метод:
"EventType": "TestEvent",
"CustomFields": {
"AuditInfo": {
"UserIdentifier": "",
"ClaimType": "",
"AuditType": 0
}
}
если вы заметили, AuditInfo помещается под тегом «Пользовательские поля». Может ли кто-нибудь объяснить мне, почему он помещается в «Пользовательские поля», когда область аудита создается вручную?
Комментарии:
1. Как вы сериализуете файл
AuditEvent
в JSON? Вы пользуетесьauditEvent.ToJson()
этим ? Также укажите, какова ваша целевая версия .net framework. Я предполагаю, что есть проблема при смешиванииNewtonsoft.Json
System.Text.Json
и. (т. Е. При использовании системы[JsonExtensionData]
from. Текст, но сериализация с помощью Newtonsoft)2. @thepirat000 Используя сериализацию по умолчанию, я использую метод auditscope.save и ничего больше. .net 5. Обновлен audit.net библиотеки для использования версии 18. Использование azure cosmos db и использование поставщика cosmos для сохранения события в cosmos.
3. о, я знаю, в чем проблема, текущая версия Audit.NET.AzureCosmos не на 100% совместима с .net 5.0, это потому, что используется библиотека AzureCosmos (Microsoft. Лазурь. DocumentDB.Core) работает только с Newtonsoft. Json, но Аудит. Целевая сеть .net 5.0 использует System.Text.Json, поэтому необходимый атрибут JsonExtensionData отсутствует. Я думаю, что мог бы исправить это, используя более новый клиент (Microsoft. Лазурь. Космос), что позволяет настроить пользовательский сериализатор. Не могли бы вы открыть здесь вопрос?
4. @открыт выпуск thepirat000 github.com/thepirat000/Audit.NET/issues/434
Ответ №1:
Это было исправлено в последней Audit.NET.AzureCosmos
версии.
Проблема: https://github.com/thepirat000/Audit.NET/issues/434
Проблема заключалась в том Audit.NET.AzureCosmos
, что ранее использовалась библиотека Microsoft.Azure.DocumentDB.Core
, которая была связана с Newtonsoft.Json
.NET 5.0, но Audit.NET
предназначалась для использования System.Text.Json
, поэтому JsonExtensionData
требуемые атрибуты и другие атрибуты AuditEvent
не были приняты во внимание.
Теперь при ориентации на .NET Standard 2.0 или .NET 5.0 используется новая клиентская библиотека Microsoft.Azure.Cosmos
и устанавливается пользовательский сериализатор, поэтому сериализация обрабатывается механизмом сериализации по умолчанию из Audit.Core.Configuration.JsonAdapter
Комментарии:
1. Я думаю, что новые изменения нарушаются при попытке использовать адаптер Newtonsoft с Net 5 с приведенным ниже кодом в соответствии со статьей пользовательская сериализация: настройки var = новые настройки JsonSerializerSettings() { TypeNameHandling = TypeNameHandling. Все }; Аудит.Ядро.Конфигурация. JsonAdapter = новый JsonNewtonsoftAdapter(настройки); ниже выводится ошибка: Исключение DocumentClientException с кодом состояния BadRequest, сообщение: Сообщение: {«Ошибки»:[«Входное содержимое недопустимо, поскольку отсутствуют требуемые свойства — ‘идентификатор;’. Пытаюсь найти более подробную информацию, чтобы поделиться с вами.
2. Я думаю, что проблема в том же , так как в .NET 5.0 значение
AuditEvent.CustomFields
украшеноSystem.Text.Json.JsonExtensionData
вместоNewtonsoft.Json.JsonExtensionData
, поэтому, когдаAuditEvent
используется сериализацияNewtonsoft.Json
,CustomFields
свойство будет сериализовано как обычное поле. Я не уверен, что это можно решить, кроме как сделавAudit.NET
зависимым от обоихSystem.Text.Json
, иNewtonsoft.Json
это кажется не идеальным3. На самом деле я говорю о другой проблеме, которая выскакивает, когда я пытаюсь установить JsonNewtonsoftAdapter как сериализацию по умолчанию обработчик для проверки, затем полноценный аудит библиотека дает сбой с ошибкой DocumentClientException с кодом состояния BadRequest, сообщение: сообщение: {«ошибки»:[«ввод контента, является недействительным, поскольку требуемые свойства — ИД;’ — отсутствуют это происходит, как только мы начинаем применение и при ревизии пытается записать данные в космос
4. Да, но проблема та же самая. В этом случае cosmos требует
id
свойства в JSON, но этоAuditEvent
свойство не определено, поэтому оно задано как пользовательское поле с ключом «id», но словарь пользовательских полей требует, чтобыJsonExtensionData
атрибут был сериализован как свойства. Я проверю, могу ли я предоставить обходной путь для поставщика azure cosmos, чтобы идентификатор был установлен таким образом, чтобы он не зависел от правильной сериализации пользовательских полей. Но несовместимость с пользовательскими полями все равно будет присутствовать при смешивании System.Text. Json и Newtonsoft.Json.