2009-03-23 9 views
7

Używam jquery do wywołania usługi internetowej, która zwraca zestaw danych z kilkoma tabelami.Wykryto okrągłe odwołanie podczas serializacji obiektu typu System.Globalization.CultureInfo

To działało dobrze, dopóki nie musiałem skonfigurować mojego webmethod, aby zaakceptować parametr. Odblokowałem to po stronie klienta z

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

Teraz otrzymuję następujący błąd, gdy webmethod zwraca. Dzieje się tak niezależnie od tego, co jest zwracane w zbiorze

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

Gdy WebMethod nie posiada parametrów JS po stronie klienta wygląda tak samo, jak poniżej, z wyjątkiem danych: linia zostanie usunięty.

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: Zgodnie z sugestią, aby zmienić żądanie

data: {paramname: paramval}, 

daje następujący błąd.

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

Wystarczy zauważyć, masz rację, aby wysłać dane json jako ciąg (vs rzeczywistego json). Możesz spróbować przeformułować pytanie, aby rozwiązać problem: "Podczas serializacji obiektu typu System.Globalization.CultureInfo" wykryto cykliczne odniesienie " (co dzieje się na serwerze) – meandmycode

Odpowiedz

5

zmieniłem WebMethod wrócić

ds.GetXml(); 

i to działało. Biorąc pod uwagę, że zbiory danych można serializować, nie jestem pewien, dlaczego muszę to zrobić, ale to mnie pokonuje.

+0

Proszę wyjaśnić więcej o tym, jak zmieniłeś swój webmethod? – Pomster

1

miałem dokładnie ten sam problem,

usunąłem wirtualnego słowo kluczowe z moich jednostek wchodzących w leniwe ładowanie obiektu.

Problem rozwiązany !!

0

Wiem, że to pytanie zostało odebrane, ale natknąłem się na ten sam problem i pomyślałem, że powinienem umieścić to, co sprawdziło się tutaj, aby inni mogli, mam nadzieję, rozwiązać problem.

data: JSON.stringify(Params), 

Stosując JSON.stringify sposób mam wymaganego rezultatu

gdzie params równą {"key":"value"}

0

uruchomiony w tej reakcji, gdy było serwer wyjątek typu konwersji bok.

1

to często zdarza się podczas serializacji obiektów z jednostkąrefs i entitysets. np jeśli masz zestaw jak ten

public EntitySet<ProductCategory> Subcategories 

serializer przejdzie do ProductCategory i spróbować szeregować wszystkie zestawy tam aswell, często kończący się z powrotem na oryginalny obiekt, a zatem tworząc pętlę.

Najlepszym sposobem na uniknięcie tego jest umieszczenie [ScriptIgnore] i [NonSerialized] na polach i [ScriptIgnore] na takich właściwościach.

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

samo na referencjach

Powiązane problemy