Извлечение нетипизированных данных из MongoDB дает «Неизвестное значение дискриминатора» - PullRequest
0 голосов
/ 15 мая 2018

Мы используем log4mongo-net для сохранения проблем log4net в mongo db.Теперь мы создали простую страницу, на которой мы можем просматривать журналы прямо из браузера, читая его без типизации из mongo db.

Но, когда есть журнал, например, с POST, содержащим объект, эта операцияпотерпит неудачу с "Неизвестным значением дискриминатора 'SomeModel'".

Можем ли мы как-то сказать Mongo игнорировать Discriminator для модели routedata-> ActionArguments-> и просто десериализовать его как нетипизированный?

Мы используем mongocsharpdriver 2.4.3 .

Это понятие о том, как мы получаем данные:

var _collection = MongoDbFactory.GetDatabase(_connectionString).GetCollection<object>(_collectionName);
var result = _mongoLogsRepository.Collection.Find(filter).ToList();

Json-data:

{"_id":"5afbf3ec6f21aa0544647ea0","timestamp":"2018-05-16T09:03:40.492Z","level":"ERROR","thread":"19","logger":"X.Intranet.Common.Logging.Logger","message":"WebApi action failed","exceptiondata":{"type":"System.Data.Entity.Validation.DbEntityValidationException","message":"Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.","source":"EntityFramework","stackTrace":"   at System.Data.Entity.Internal.InternalContext.SaveChanges()\r\n   at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()\r\n   at System.Data.Entity.DbContext.SaveChanges()\r\n   at X.Intranet.Data.Contexts.XContext.SaveChanges()\r\n   at X.Intranet.Data.Handlers.ScheduleHandler.AddChange(ScheduleChange change)\r\n   at X.Intranet.Business.Managers.ScheduleManager.LogChange(Nullable`1 scheduleExceptionId, Nullable`1 scheduleExtraId, User currentUser, ScheduleChangeReason reason, Assistant fromAssistant, Assistant toAssistant, DateTimePeriodNullable oldTime, DateTimePeriodNullable newTime, Boolean vacant, Boolean noAssistance, String note)\r\n   at X.Intranet.Business.Managers.ScheduleManager.AddVacantAnswer(WorkingPeriod period, Boolean answer, String comment, User currentUser)\r\n   at X.Intranet.Ui.Areas.App.Controllers.Api.Assistant.AppScheduleVacanyController.Answer(Int32 clientId, AppScheduleVacantShiftRequest model)\r\n   at lambda_method(Closure , Object , Object[] )\r\n   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)\r\n   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)\r\n   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Filters.AuthorizationFilterAttribute.<ExecuteAuthorizationFilterAsyncCore>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Controllers.ExceptionFilterResult.<ExecuteAsync>d__0.MoveNext()"},"userdata":{"userName":"test.assistent"},"routedata":{"Method":"POST","RequestUrl":"https://xxx.azurewebsites.net:443/app/api/v1/assistant/appschedulevacany/answer?clientId=1786","Controller":"X.Intranet.Ui.Areas.App.Controllers.Api.Assistant.AppScheduleVacanyController","Action":"Answer","ActionArguments":{"clientId":1786,"model":{"_t":"AppScheduleVacantShiftRequest","ShiftItemId":"O:182270:2018-06-13 15:00","Answer":false,"Comment":null}},"ReferrerUrl":null},"data":null}

Stacktrace при использовании BsonDocument вместо объекта:

в MongoDB.Bson.BsonValue.System.IConvertible.ToType (Тип преобразование TypeType, поставщик IFormatProvider в Newtonsoft.Json.JsonWriter.WriteValue writer (JsonWriter writer), PrimitiveTypeCode typeCode, значение объекта в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializePrimitive (модуль записи JsonWriter, значение объекта, JsonPrimitiveContract Контракт, член JsonProperty, JsonContainerContract containerContract, JsonProperty containerProperty в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue (записывающее устройство JsonWriter, значение объекта, значение JsonContractContract, член JsonProperty, контейнер JsonProject.ract.Jerver.ontСредство записи JsonWriter, Значение объекта, Контракт JsonObjectContract, Член JsonProperty, collectionContract JsonContainerContract, Контейнер JsonProperty в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialization.JsonSerializerInternalWriter.SerializeList (писатель JsonWriter, IEnumerable значения, контракт JsonArrayContract, член JsonProperty, коллекция JsonContainerContractConContract, JsonProperty containerProperty в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue (модуль записи JsonWriter, значение объекта, значение JsonContractContract, элемент JsonProperty, контейнерный JConContainerContract, значение JsonProperty, JJProper.Jerverконтракт, член JsonProperty, коллекцию JontContainerContractContract, JsonProperty containerProperty в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue (элемент записи JsonWriter, значение объекта JsonContract valueContract, элемент JsonProperty.JerverJerverSoftписатель, IEnumerable значения, контракт JsonArrayContract, член JsonProperty, JsonContainerContract collectionContract, JsonProperty containerProperty в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue (модуль записи JsonWriter, значение объекта, значение JsonContractContract, член JsonProperty, контейнер JontContainerContract, контейнер JConContainer, свойство JSONSperizer.JsonSerializer.containerProperty в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue (модуль записи JsonWriter, значение объекта, JsonContract valueContract, член JsonProperty, JsonContainerContract containerContract, JsonProperty, свойство контейнера ContainerConnect, JsonProperty, значение объекта Newtonsoft.Json.riter.jerв Newtonsoft.Json.JsonSerializer.SerializeInternal (JsonWriter jsonWriter, Значение объекта, Тип objectType в System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream (Тип тип, Значение объекта, Stream writeStream, Кодирование эффективноеEncoding в System.For.tt.JsonMediaTypeFormatter.WriteToStream (Тип типа, Значение объекта, Поток writeStream, Кодирование эффективноеEncoding в System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream (Тип тип, Значение объекта, Поток writeStream, HttpContent. Содержание в System.Net.Hatt.WriteToStreamAsync (Тип типа, Значение объекта, Поток writeStream, Содержимое HttpContent, TransportContext transportContext, CancellationToken cancellationToken).System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача вSystem.Web.Http.WebHost.HttpControllerHandler.d__1b.MoveNext ()

Заранее спасибо!

1 Ответ

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

Должно работать следующее:

var _collection = MongoDbFactory.GetDatabase(_connectionString).GetCollection<BsonDocument>(_collectionName);
...