从Angularjs服务调用时,在WebApi中对延迟加载的nHibernate对象进行JsonSerializationException

Dec*_*lty 5 nhibernate json asp.net-web-api angularjs

我从Angularjs服务调用WebApi控制器Get方法.

角度服务:

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
    };
}]);
Run Code Online (Sandbox Code Playgroud)

WebApi Get方法:

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

500 server error在客户端获得了一个,其内部例外是:

ExceptionMessage: "Error getting value from 'IdentityEqualityComparer' on 
'NHibernate.Proxy.DefaultLazyInitializer'."
ExceptionType: "Newtonsoft.Json.JsonSerializationException"
Run Code Online (Sandbox Code Playgroud)

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

编辑: 我通过添加以下一个班轮来解决上述异常,WebApiConfig.cs根据这个答案:

((DefaultContractResolver)config.Formatters.JsonFormatter.SerializerSettings.
                           ContractResolver).IgnoreSerializableAttribute = true;
Run Code Online (Sandbox Code Playgroud)

现在我有这个例外:

ExceptionMessage: "Error getting value from 'DefaultValue'
on 'NHibernate.Type.DateTimeOffsetType'."
ExceptionType: "Newtonsoft.Json.JsonSerializationException"
Run Code Online (Sandbox Code Playgroud)

关于是否有类似的东西的任何想法,我可以做到解决这个问题?

Dec*_*lty 11

基于这个答案这个答案,我已经通过添加以下类来解决了这个问题

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将其设置为在合同解析器Application_StartGlobal.asax.cs:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings
                            .ContractResolver = new NHibernateContractResolver();
Run Code Online (Sandbox Code Playgroud)