从 Angularjs 服务调用时,WebApi 中延迟加载的 nHibernate 对象出现 JsonSerializationException

标签 json angularjs nhibernate asp.net-web-api

我正在从 Angularjs 服务调用 WebApi Controller Get 方法。

angular.service :

app.service('MyService', ['$http', function ($http) {

    var getMyObjects = function () {
        var myObjects;
        var promise = $http.get('/api/objects/').success(function (data) {
            myObjects = data;
         }).error(function (data, status, headers, config) {

         });

         return promise;
    };

    return {
        myObjects: myObjects
    };
}]);

WebApi 获取方法:

public class ObjectsController : ApiController
{
    public IEnumerable<MyObject> Get()
    {
        return _objectRepository.GetAll().ToArray();
    }
}

我在客户端收到 500 服务器错误,其内部异常是:

ExceptionMessage: "Error getting value from 'IdentityEqualityComparer' on 
'NHibernate.Proxy.DefaultLazyInitializer'."
ExceptionType: "Newtonsoft.Json.JsonSerializationException"

我应该怎么做才能解决这个问题?

编辑: 我通过按照 this answer 将以下一行添加到 WebApiConfig.cs 解决了上述异常。 :

((DefaultContractResolver)config.Formatters.JsonFormatter.SerializerSettings.
                           ContractResolver).IgnoreSerializableAttribute = true;

现在我有这个异常(exception):

ExceptionMessage: "Error getting value from 'DefaultValue'
on 'NHibernate.Type.DateTimeOffsetType'."
ExceptionType: "Newtonsoft.Json.JsonSerializationException"

有什么想法可以解决这个问题吗?

最佳答案

基于this answerthis answer ,我通过添加以下类解决了该问题

public class NHibernateContractResolver : DefaultContractResolver
{
   protected override JsonContract CreateContract(Type objectType) 
   {
      if (typeof(NHibernate.Proxy.INHibernateProxy).IsAssignableFrom(objectType))
          return base.CreateContract(objectType.BaseType);

        return base.CreateContract(objectType);
    }
}

然后将其设置为 Global.asax.cs 中的 Application_Start 中的合约解析器:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings
                            .ContractResolver = new NHibernateContractResolver();

关于从 Angularjs 服务调用时,WebApi 中延迟加载的 nHibernate 对象出现 JsonSerializationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25011406/

相关文章:

c# - Nhibernate 在 db create 脚本中生成错误

nhibernate - 手动使 NHibernate 二级缓存失效

javascript - 是否通过 AJAX 组件中包含的循环组件扩展 JSON 元素? - react JS

javascript - 使用 Angular Directive(指令)在页面加载时重新缩放和裁剪图像

javascript - Angular : Set conditional min and max value for validation in number input field

nhibernate - 使用 nHibernate 将两种不同的数据模型映射到一个实体模型

javascript - 如何在 Angular 上显示 json 列表?

json - 在ansible中修改json的最佳方法

java - 我将使用什么语法让我的程序忽略下划线、标点符号和所有其他驼峰式命名法等

javascript - AngularJS ui-router 不适用于嵌套 View