2009-03-23 56 views
7

Estoy usando jquery para llamar a un servicio web que devuelve un conjunto de datos con un par de tablas.Se detectó una referencia circular al serializar un objeto de tipo System.Globalization.CultureInfo

Esto estaba funcionando bien hasta que necesité configurar mi webmethod para aceptar un parámetro. Reflejé esto en el lado del cliente con

data: "{paramname:'" + paramval+ "'}", 

Ahora obtengo el siguiente error cuando el método web retorna. Esto ocurre independientemente de cuál de ser devuelto en el conjunto de datos

Error:{"Message":"A circular reference was detected while serializing an object of type \u0027System.Globalization.CultureInfo\u0027.","StackTrace":" at System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat)\r\n at ...etc

Cuando el WebMethod no tiene parámetros de la JS lado del cliente se ve igual que a continuación, excepto los datos: se elimina la línea.

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); } 
    } 
}); 

}

Edit: Como por sugerencia de cambiar la solicitud a

data: {paramname: paramval}, 

produce el siguiente error.

Error:{"Message":"Invalid JSON primitive: paramval.","StackTrace":"
at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()\r\n at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)\r\n at System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)\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](String input)\r\n at System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context, JavaScriptSerializer serializer)\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"} Status: 500

+0

para notar, usted tiene razón para enviar los datos JSON como una cadena (vs JSON real). Usted podría tratar de reformular la pregunta de cómo resolver el error: "Se ha detectado una referencia circular al serializar un objeto de tipo System.Globalization.CultureInfo" (que es lo que está sucediendo en el servidor) – meandmycode

Respuesta

5

cambié WebMethod para volver

ds.GetXml(); 

y esto funcionó. Considerando que los conjuntos de datos son serializables, no estoy seguro de por qué tengo que hacer esto, pero me supera este obstáculo.

+0

Por favor, ¿podría explicar más sobre cómo cambiaste tu webmethod? – Pomster

1

que tenían el mismo problema,

me quita la palabra clave virtual de mis entidades que conforman la carga diferida del objeto.

¡Problema resuelto!

0

Sé que esta pregunta ha sido respondida, pero me encontré con el mismo problema y pensé que debería poner lo que funcionó para mí aquí para que otros puedan abordar el problema con suerte.

data: JSON.stringify(Params), 

Al utilizar el método deJSON.stringify me dieron el resultado deseado

donde params es igual a {"key":"value"}

0

me encontré con esta respuesta cuando había un servidor de conversión de tipo de excepción lado.

1

esto sucederá a menudo al serializar objetos con entityrefs y entitysets. por ejemplo si usted tiene un conjunto como éste

public EntitySet<ProductCategory> Subcategories 

el serializador entrará en el ProductCategory e intentar serializar todos los conjuntos de allí también, a menudo terminan de nuevo en el objeto original, y por lo tanto la creación de un bucle.

La mejor manera de evitar esto es poner [ScriptIgnore] y [NonSerialized] en los campos y [ScriptIgnore] en propiedades como esta.

[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); } } 

Igual en las referencias

Cuestiones relacionadas