Картограф Sitecore Glass с веб-API

Я получаю следующую ошибку только на действующем сервере, при вызове функции с помощью WebApi я использую стеклянный картограф Sitecore.

{
    "$id": "1",
    "Message": "An error has occurred.",
    "ExceptionMessage": "The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; charset=utf-8'.",
    "ExceptionType": "System.InvalidOperationException",
    "StackTrace": null,
    "InnerException": {
        "$id": "2",
        "Message": "An error has occurred.",
        "ExceptionMessage": "Error getting value from 'proxyGenerationOptions' on 'Castle.Proxies.BaseItemProxy'.",
        "ExceptionType": "Newtonsoft.Json.JsonSerializationException",
        "StackTrace": " at Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter writer, Object value, JsonContainerContract contract, JsonProperty member, JsonProperty property, JsonContract& memberContract, Object& memberValue)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IWrappedCollection values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IWrappedCollection values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value)\r\n at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value)\r\n at System.Net.Http.Formatting.JsonMediaTypeFormatter.<>c__DisplayClassd.b__c()\r\n at System.Threading.Tasks.TaskHelpers.RunSynchronously(Action action, CancellationToken token)",
        "InnerException": {
            "$id": "3",
            "Message": "An error has occurred.",
            "ExceptionMessage": "Common Language Runtime detected an invalid program.",
            "ExceptionType": "System.InvalidProgramException",
            "StackTrace": " at GetproxyGenerationOptions(Object )\r\n at Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)"
        }
    }
}

person Ayman Barhoum    schedule 30.05.2014    source источник
comment
Должно быть что-то, связанное с данными в вашей живой базе данных. Сделайте резервную копию живого и попробуйте воспроизвести на локальном компьютере, отладив его.   -  person Harsh Baid    schedule 30.05.2014
comment
Я уже указал строку подключения к действующей базе данных и все равно получаю ту же ошибку.   -  person Ayman Barhoum    schedule 30.05.2014
comment
Я предполагаю, что любой символ в содержании вызывает эту проблему. Проверьте путем отладки, а затем попробуйте сериализовать этот определенный фрагмент данных в изолированном приложении.   -  person Harsh Baid    schedule 31.05.2014
comment
Также проверьте дополнительные ссылки здесь stackoverflow.com/a/18134380/468718 и stackoverflow.com/a/14056232/468718   -  person Harsh Baid    schedule 31.05.2014


Ответы (1)


Ваш BaseItem вызывает у вас некоторые проблемы, если вам не нужно какое-либо свойство с типом BaseItem, сделайте следующее:

1- Создайте новый класс для Json Contract Resolver.

public class JsonContractResolver : DefaultContractResolver
{
public JsonContractResolver():base()
{

}
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
    IList<JsonProperty> filtered = new List<JsonProperty>();

    foreach (JsonProperty p in base.CreateProperties(type, memberSerialization))
     {
        if (p.PropertyType != typeof(BaseItem))
          filtered.Add(p);

         return filtered;
     } 
}
}

2- добавьте этот код в настройки конфигурации маршрутизации.

var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
jsonFormatter.SerializerSettings.ContractResolver = new JsonContractResolver();
person Ahmed Okour    schedule 01.06.2014