【问题标题】:Sitecore Glass mapper with web API带有 Web API 的 Sitecore Glass 映射器
【发布时间】:2014-05-30 15:55:11
【问题描述】:

我只在实时服务器上收到以下错误,在使用 WebApi 调用函数时,我使用的是 Sitecore glass mapper。

{
    "$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)"
        }
    }
}

【问题讨论】:

  • 你的live db上一定有一些与数据相关的东西。备份live并尝试通过调试在本地重现。
  • 我已经将连接字符串指向实时数据库,但仍然出现同样的错误。
  • 我猜内容中的任何字符都会导致此问题。通过调试检查,然后尝试在隔离应用程序中序列化该特定数据块。

标签: asp.net-web-api json.net sitecore glass-mapper


【解决方案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();

【讨论】:

    猜你喜欢
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多