在序列化System.Globalization.CultureInfo类型的对象时检测到循环引用

时间:2009-03-23 11:45:21

标签: c# jquery web-services json

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

这工作正常,直到我需要设置我的webmethod来接受参数。我在客户端用

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

我现在在webmethod返回时收到以下错误。无论数据集中返回什么

,都会发生这种情况
  

错误:{“消息”:“序列化时检测到循环引用   类型的对象   \ u0027System.Globalization.CultureInfo \ u0027。“,”StackTrace“:”at   System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(对象   o,StringBuilder sb,Int32 depth,Hashtable objectsInUse,   SerializationFormat serializationFormat)\ r \ n at ... etc

当webmethod没有参数时,客户端js看起来与下面相同,除了数据:line被删除。

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},

产生以下错误。

  

错误:{“消息”:“无效的JSON原语:paramval。”,“StackTrace”:“
  在   System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject(个)\ r \ n   在   System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(的Int32   深度)\ r \ n at   System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(字符串   输入,Int32 depthLimit,JavaScriptSerializer序列化程序)\ r \ n at   System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer   serializer,String input,Type type,Int32 depthLimit)\ r \ n at   System.Web.Script.Serialization.JavaScriptSerializer.Deserialize [T](字符串   输入)\ r \ n at   System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext的   context,JavaScriptSerializer序列化程序)\ r \ n at   System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData   methodData,HttpContext context)\ r \ n at   System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext的   context,WebServiceMethodData   methodData)“,”ExceptionType“:”System.ArgumentException“}状态:500

5 个答案:

答案 0 :(得分:5)

我改变了我的webmethod以返回

ds.GetXml();

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

答案 1 :(得分:1)

我遇到了同样的问题,

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

问题解决了!!

答案 2 :(得分:1)

在使用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); } }

参考文献

答案 3 :(得分:0)

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

data: JSON.stringify(Params),

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

其中参数等于{"key":"value"}

答案 4 :(得分:0)

当存在类型转换异常服务器端时,我遇到了此响应。