【问题标题】:A circular reference was detected while serializing an object of type System.Globalization.CultureInfo序列化 System.Globalization.CultureInfo 类型的对象时检测到循环引用
【发布时间】:2010-10-14 22:58:31
【问题描述】:

我正在使用 jquery 调用一个 web 服务,它返回一个包含几个表的数据集。

在我需要设置我的 web 方法以接受参数之前,这一切正常。我用

在客户端反映了这一点
data: "{paramname:'" + paramval+ "'}",

当 web 方法返回时,我现在收到以下错误。无论数据集中返回什么,都会发生这种情况

Error:{"Message":"序列化时检测到循环引用 类型的对象 \u0027System.Globalization.CultureInfo\u0027.","StackTrace":" at System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse, SerializationFormat serializationFormat)\r\n at ...等

当 webmethod 没有参数时,客户端 js 看起来和下面一样,除了 data: 行被删除。

function ClientWebService(paramval){
$.ajax({
    type: "POST",
    url: "WebService1.asmx/webmethodName", 
    data: "{paramname:'" + paramval+ "'}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(msg) {
        ParseResult(msg.d);
    },
    error: function(err) {
        if (err.status == 200) {
              ParseResult(err);
        }
        else { alert('Error:' + err.responseText + '  Status: ' + err.status); }
    }
}); 

}

编辑:根据建议将请求更改为

data: {paramname: paramval},

产生以下错误。

错误:{"Message":"无效的 JSON 原语:paramval。","StackTrace":"
在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()\r\n 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 深度)\r\n 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(字符串 输入,Int32 depthLimit,JavaScriptSerializer 序列化程序)\r\n at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer 序列化程序、字符串输入、类型类型、Int32 depthLimit)\r\n at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](字符串 输入)\r\n 在 System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext 上下文,JavaScriptSerializer 序列化程序)\r\n at System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData 方法数据,HttpContext 上下文)\r\n 在 System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext 上下文,WebServiceMethodData methodData)","ExceptionType":"System.ArgumentException"} 状态:500

【问题讨论】:

  • 请注意,您将 json 数据作为字符串发送是正确的(与实际的 json 相比)。您可以尝试将问题改写为如何解决错误:“在序列化 System.Globalization.CultureInfo 类型的对象时检测到循环引用”(这是服务器上发生的情况)

标签: c# jquery web-services json


【解决方案1】:

我改变了我的 webmethod 来返回

ds.GetXml();

这很有效。考虑到数据集是可序列化的,我不知道为什么必须这样做,但它让我克服了这个障碍。

【讨论】:

  • 请您详细解释一下您是如何更改网络方法的?
【解决方案2】:

我遇到了同样的问题,

我从我的实体中删除了 Virtual 关键字,这会延迟加载对象。

问题解决了!!

【讨论】:

    【解决方案3】:

    这通常会在使用 entityrefs 和 entitysets 序列化对象时发生。 例如,如果你有这样的一套

    public EntitySet<ProductCategory> Subcategories 
    

    序列化器将进入ProductCategory 并尝试序列化那里的所有集合,通常最终回到原始对象,因此创建一个循环。

    避免这种情况的最佳方法是将[ScriptIgnore][NonSerialized] 放在字段上,将[ScriptIgnore] 放在这样的属性上。

    [ScriptIgnore]
    [NonSerialized]
    private EntitySet < ProductCategory > _Subcategories;
    [ScriptIgnore]
    [Association(Storage = "_Subcategories", ThisKey = "ID", OtherKey = "ParentID")]
    public EntitySet < ProductCategory > Subcategories {
     get {
      return this._Subcategories;
     }
     set {
      this._Subcategories.Assign(value);
     }
    }
    

    参考文献相同

    【讨论】:

      【解决方案4】:

      我知道这个问题已经得到解答,但我遇到了同样的问题,我想我应该把对我有用的东西放在这里,这样其他人就可以解决这个问题。

      data: JSON.stringify(Params),
      

      通过使用 JSON.stringify 方法,我得到了所需的结果

      其中 params 等于 {"key":"value"}

      【讨论】:

        【解决方案5】:

        当服务器端出现类型转换异常时,我遇到了这个响应。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-04
          • 2012-12-01
          • 1970-01-01
          • 2015-01-21
          • 2010-11-12
          • 2013-04-23
          • 1970-01-01
          相关资源
          最近更新 更多