2009-07-18 2 views
2

Я использую страницу asp.net, полностью ааксированную (с jquery lib) и вызывающую другую страницу обратного вызова asp.net для получения/отправки данных на сервер. Некоторых пользователи моей страницы, испытывающих следующее сообщение об ошибке при сериализации объекта JSonСериализация объектов json при вызове функции обратного вызова ajax asp.net

произошла ошибка десериализация объекта типа типа ... объект ... содержит недопустимые UTF8 байт

$.ajax({ 
    type: "POST", 
    async: false, 
    url: 'AjaxCallbacks.aspx?Action=' + actionCode, 
    data: { 
     objectToSerialize: JSON.stringify(obj, null, 2) 
    }, 
    dataType: "json", 
    success: function(operationResult) { 
     //handle success 
    }, 
    error: function(xhttp, textStatus, errorThrown) { 
     //handle error 
    } 
}); 

иметь дело с этим я добавил опцию «CONTENTTYPE» ...

$.ajax({ 
    type: "POST", 
    async: false, 
    url: 'AjaxCallbacks.aspx?Action=' + actionCode, 
    data: { 
     objectToSerialize: JSON.stringify(obj, null, 2) 
    }, 
    contentType: 'application/json; charset=utf-8', //<-- added to deal with deserializing error 
    dataType: "json", 
    success: function(operationResult) { 
     //handle success 
    }, 
    error: function(xhttp, textStatus, errorThrown) { 
     //handle error 
    } 
}); 

, но теперь я не могу прочитать этот объект на стороне сервера, как я мог до:

string objectJson = Request.Params["objectToSerialize"].ToString(); 

У меня возникла следующая ошибка: «Ссылка на объект не установлена ​​в экземпляр объекта».

Любые идеи?

+0

Можете ли вы проверить, какой параметр сообщения был передан серверу? Используйте Firebug, чтобы проверить, возможно. – xandy

+0

Вот образец того, что я нашел в моей вкладке (firebug) объектаToSerialize =% 7B% 0A ++% 22Id% 22% 3A +% 22846% 22% 2C% 0A ++% 22FolderId% 22% 3A +% 22405% 22% 2C% 0A ++ % 22Positio% 22% 3A +% 22% 22% 0A% 7D Вкладка Params (firebug) содержит только код действия, я решил, что я отправляю сообщения и не могу получить доступ к этому объекту json через список параметров на сервере, вместо этого он должен быть в форме коллекции, еще не уверен, как это получить .. – krul

+0

Я думаю, что я прочитал запрос Request.InputStream ...? – krul

ответ

2

Причина, по которой вы получаете NullReferenceException во втором случае, заключается в том, что вы используете application/json в качестве заголовка Content-Type при отправке вашего запроса, и на серверной стороне ASP.NET ожидает, что данные будут отправлены в виде публикации формы при заполнении запроса и поэтому он не содержит параметр objectToSerialize. Вы можете попробовать следующие вместо:

contentType: 'application/x-www-form-urlencoded; charset=utf-8' 

Или придерживаться application/json и читать и анализировать поток запроса вручную:

using (var reader = new StreamReader(Request.InputStream)) 
{ 
    var input = reader.ReadToEnd(); 
    var objectToSerialize = input.Split('=')[1]; 
} 
0

Вот как я решил мою проблему: Поскольку я меняю ТипСодержимого сервер думает что данные должны поступать в виде коллекции, вместо этого он поступает из request.inputstream, поэтому я написал функцию для чтения & декодировать входной поток, а остальная часть кода не изменяется:

До сих пор это работает.

Только что понял, что был ответ, похожий на мой (2 балла), но отсутствует декодирование, без которого сериализация в .net-объект не будет работать. Также мне пришлось вырезать GetInputStream() заданную строку из "jsonObjectName =" для succedd с сериализацией в .net-объект, аналогично тому, что было предложено путем слияния строки потока