Сериализация объектов json при вызове страницы обратного вызова ajax asp.net - PullRequest
2 голосов
/ 18 июля 2009

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

произошла ошибка десериализации объект типа ... тип объекта ... содержит недопустимый 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();

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

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 18 июля 2009

Причина, по которой вы получаете NullReferenceException во втором случае, заключается в том, что вы используете application/json в качестве заголовка Content-Type при отправке запроса и на стороне сервера ASP.NET ожидает поступления данных в виде отправки формы при заполняет объект Request, поэтому он не содержит параметр 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 голосов
/ 18 июля 2009

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

  /// <summary>
  /// reads request input stream and decodes it so it can be deserialized to .net object
  /// </summary>
  /// <returns>decoded request input stream</returns>
  private string GetInputStream()
  {
     string inputContent;
     using (var sr = new System.IO.StreamReader(Request.InputStream))
        inputContent = sr.ReadToEnd();

     return Server.UrlDecode(inputContent);
  }

Пока это работает.

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

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