При сериализации объекта типа System.Globalization.CultureInfo была обнаружена циклическая ссылка - PullRequest
7 голосов
/ 23 марта 2009

Я использую jquery для вызова веб-службы, которая возвращает набор данных с несколькими таблицами в нем.

Это работало нормально, пока мне не нужно было настроить мой веб-метод для принятия параметра. Я отразил это на стороне клиента с

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

Теперь я получаю следующую ошибку, когда веб-метод возвращается. Это происходит независимо от того, что возвращается в наборе данных

Ошибка: {"Сообщение": "Обнаружена циклическая ссылка при сериализации объект типа \ u0027System.Globalization.CultureInfo \ u0027. "," StackTrace ":" в System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal (Объект o, StringBuilder sb, глубина Int32, объекты HashtableInUse, SerializationFormat SerializationFormat) \ r \ n в ... и т. Д.

Когда у веб-метода нет параметров, клиентская сторона 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},

выдает следующую ошибку.

Ошибка: {"Сообщение": "Недопустимый примитив JSON: paramval.", "StackTrace": "
в System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject () \ г \ п в System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal (Int32 глубина) \ r \ n в System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize (String ввод, Int32 deepLimit, сериализатор JavaScriptSerializer) \ r \ n в System.Web.Script.Serialization.JavaScriptSerializer.Deserialize (JavaScriptSerializer сериализатор, строковый ввод, тип Type, Int32 deepLimit) \ r \ n в System.Web.Script.Serialization.JavaScriptSerializer.Deserialize [Т] (Строка вход) \ r \ n в System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest (HttpContext контекст, сериализатор JavaScriptSerializer) \ r \ n в System.Web.Script.Services.RestHandler.GetRawParams (WebServiceMethodData methodData, контекст HttpContext) \ r \ n в System.Web.Script.Services.RestHandler.ExecuteWebServiceCall (HttpContext контекст, WebServiceMethodData methodData) "," ExceptionType ":" System.ArgumentException "} Статус: 500

Ответы [ 5 ]

5 голосов
/ 23 марта 2009

Я изменил свой веб-метод для возврата

ds.GetXml();

и это сработало. Учитывая, что наборы данных сериализуемы, я не уверен, почему я должен это делать, но это преодолевает это препятствие.

1 голос
/ 05 марта 2015

это часто происходит при сериализации объектов с 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); } }

То же самое на Refs

1 голос
/ 04 марта 2012

У меня была точно такая же проблема,

Я удалил ключевое слово Virtual из своих сущностей, которое выполняет отложенную загрузку объекта.

Проблема решена !!

0 голосов
/ 23 марта 2013

Я столкнулся с этим ответом, когда была сторона сервера исключений для преобразования типов.

0 голосов
/ 12 апреля 2012

Я знаю, что на этот вопрос был дан ответ, но я столкнулся с той же проблемой и подумал, что должен поставить то, что мне помогло, чтобы другие могли надеяться решить эту проблему.

data: JSON.stringify(Params),

Используя метод JSON.stringify , я получил требуемый результат

где params равно {"key":"value"}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...