У меня есть класс POCO, который наследуется от нескольких классов, чтобы дать поддержку INotifyPropertyChanged и DataAnnotations. Когда WebAPI возвращает экземпляр суда, сериализатор JSON.NET дроссели на анонимном метода делегат в ModelPropertyAnnotationsValidation с исключением (показывая RAW ответ от Скрипача):Ошибка сериализации JSON.NET в WebApi
{ «Message»: "Произошла ошибка. ""ExceptionMessage": "введите '' ObjectContent`1 не удалось сериализовать тело ответа для контента типа 'приложения/JSON; кодировка = UTF-8'", "ExceptionType.":" System.InvalidOperationException "," StackTrace ": null," InnerException ": {" Сообщение ":" произошла ошибка . ", " ExceptionMessage ":" Ошибка получения значения от "CS $ <> 9_ CachedAnonymousMethodDelegate5' на 'Sample.Data.Models.Court' "" ExceptionType. ":" Newtonsoft.Json.JsonSerializationException " "StackTrace":" в Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue (Объект мишени) \ г \ п на Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues (JsonWriter писателя, значение объекта, контракт JsonContainerContract, JsonProperty членов, JsonProperty недвижимость, JsonContract & memberContract, объект & memberValue) \ г \ п на Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject (JsonWriter writer, Object va LUE, контракт JsonObjectContract, JsonProperty член, JsonContainerContract collectionContract, JsonProperty containerProperty) \ г \ п на Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue (JsonWriter автор, значение объекта, JsonContract valueContract, член JsonProperty, JsonContainerContract containerContract, JsonProperty containerProperty) \ г \ п на Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize (jsonWriter jsonWriter, значение объекта) \ г \ п на Newtonsoft.Json.JsonSerializer.SerializeInternal (jsonWriter jsonWriter, значение объекта) \ г \ n в System.Net.Http.Formatting.JsonMediaTypeFormatter. <> гр _DisplayClassd.b_ с() \ г \ п в System.Threading.Tasks.TaskHelpers.RunSynchronously (бродилки, CancellationToken лексем) " "InnerException": { "Сообщение":" ошибка имеет произошло ""ExceptionMessage.":". Common Language Runtime обнаружен недопустимый программу ", "ExceptionType": "System.InvalidProgramException", "StackTrace":" в GetCS $ <> 9 _CachedAnonymousMethodDelegate5 (Object) \ r \ n в Newtonsoft.Json.Serialization.DynamicValueProvider.ПолучитьЗначение (Объект мишени) "}}}
класса Суда (отредактированная для краткости):
using System;
using System.Collections.Generic;
using Sample.Data.Models.Infrastructure;
namespace Sample.Data.Models
{
[Serializable]
public partial class Court : ModelPropertyAnnotationsValidation
{
public Court()
{
}
private int _courtID;
public int CourtID
{
get { return _courtID; }
set
{
_courtID = value;
OnPropertyChanged(() => CourtID);
}
}
}
}
Здесь унаследованный абстрактный класс, где вопрос проживает (если изменить газопоглотитель на public string this[string columnName]
к возвращает пустую строку, она работает:
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
namespace Sample.Data.Models.Infrastructure
{
public abstract class ModelPropertyAnnotationsValidation : ModelBase
{
public string this[string columnName]
{
get
{
var type = GetType();
var modelProperties = TypeDescriptor.GetProperties(type).Cast<PropertyDescriptor>();
var enumerable = from modelProperty in modelProperties.Where(modelProp => modelProp.Name == columnName)
from attribute in modelProperty.Attributes.OfType<ValidationAttribute>().Where(attribute => !attribute.IsValid(modelProperty.GetValue(this)))
select attribute.ErrorMessage;
return enumerable.FirstOrDefault();
}
private set { ; } //http://developerstreasure.blogspot.com/2010/05/systemruntimeserializationinvaliddataco.html
}
public string Error
{
get { return null; }
private set { ; } //http://developerstreasure.blogspot.com/2010/05/systemruntimeserializationinvaliddataco.html
}
public virtual bool IsValid
{
get
{
var validationContext = new ValidationContext(this, null, null);
var valid = Validator.TryValidateObject(this, validationContext, null, validateAllProperties: true);
return valid;
}
private set { ; } //http://developerstreasure.blogspot.com/2010/05/systemruntimeserializationinvaliddataco.html
}
}
}
И для полноты картины, вот ModelBase:
using System;
using System.ComponentModel;
using System.Linq.Expressions;
namespace Sample.Data.Models.Infrastructure
{
public abstract class ModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(Expression<Func<object>> property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(BindingHelper.Name(property)));
}
}
}
}
И контроллер WebAPI (который является очень простым для этой цели):
using System.Web.Http;
using Sample.Data.Models;
namespace Sample.Services.Api.Controllers
{
public class CourtsController : ApiController
{
// GET api/values
public Court Get()
{
return new Court {Abbreviation = "TEST", FullName = "Test Court", Active = true};
}
}
}
Как я могу получить то, что я полагаю, анонимный делегат, чтобы пройти через сериализацию ... игнорировал или иначе?
4.5.11 был установлен с WebApi, и я не думал проверять обновления через NuGet. Теперь он в 5.0.8 и работает, так что это была абсолютно проблема. Спасибо, Джеймс ... за ответ и за Json.NET. :) –