Как использовать MS Ajax PageMethods для вызова функции на сервере - PullRequest
0 голосов
/ 16 января 2011

У меня есть проект, который использует PageMethods для вызова функций на сервере. Серверные функции (написанные на C #) возвращают значения в виде массива строк без какой-либо сериализации, а на стороне клиента (из Js) доступ к возвращаемым значениям осуществляется с помощью статической переменной с именем arguments . , Я обнаружил, что иногда для некоторых пользователей (случаи не воспроизводятся) иногда происходит исключение

"WebServiceFailedException серверный метод 'Foo' вернул недопустимые данные. свойство 'd' отсутствует в JSON. "

При поиске в Google я обнаружил, что люди сериализуют возвращаемые значения с помощью класса DataContractJsonSerializer и в js получают доступ к возвращаемому значению с помощью одной из функций обратного вызова. Пример:

функция OnRequestComplete (результат, userContext, methodName) {
var Person = eval ('(' + result + ')'); предупреждение (Person.Forename);
оповещения (Person.Surname); }

Значит, первая техника верна? или что?

P.S: функция на сервере определяется в файле default.aspx.cs следующим образом:

[System.Web.Services.WebMethodAttribute(), System.Web.Script.Services.ScriptMethodAttribute()]
    public static string[] Foo(string s);

со стороны клиента вызов выглядит следующим образом

PageMethods.Foo("value",OnSuccess);

Также все пользователи имеют одинаковую версию браузера (IE8)

Ответы [ 3 ]

1 голос
/ 19 января 2011

Я не знаю, является ли это всей проблемой, но ваша первая проблема - ручная сериализация возвращаемого значения. PageMethods и ScriptServices автоматически JSON сериализуют свои возвращаемые значения. Вложение двух уровней JSON определенно может привести к рывку в процессе десериализации клиентской части фреймворка (который также происходит автоматически перед вашим кодом eval ()).

Чтобы вернуть экземпляр вашего класса Person, это все, что вам нужно:

public static Person GetPerson() {
  Person p = new Person();

  // Populate the Person object here.

  return p;
}

Затем на стороне клиента вы можете работать со свойствами объекта, как и ожидалось:

function OnRequestComplete(result, userContext, methodName) {
  console.log('Person name: ' + result.Forename + ' ' + result.Surname);
}

В качестве альтернативы, если вы используете jQuery для других задач и уже имеете его на странице, вам даже не нужны ScriptManager и MS AJAX для вызова методов страницы. Вы можете напрямую вызывать методы страницы с помощью jQuery и пропускать все эти накладные расходы.

0 голосов
/ 18 января 2011

Это немного забавно. ASP.NET всегда добавляет «d» ко всем результатам. Так что либо должно работать, либо нет. Вот некоторая предыстория вопроса «d»:
http://encosia.com/2009/06/29/never-worry-about-asp-net-ajaxs-d-again/

0 голосов
/ 16 января 2011

Не зная, как делается запрос и как закодирован конец сервера, мой ответ может быть неточным.

Где в вашем коде на стороне сервера оформлен метод WebMethod? Если это отдельный класс с атрибутом ScriptService, и если при выполнении запроса указывается JSON, то значения JSON должны быть автоматически сериализованы и не должны быть снова сериализованы вручную При такой настройке ASP.NET 3.5 упаковывает ответ в объект "d"

Некоторые пользователи могут получить исключение из-за браузера, который они используют. Если вы используете jQuery, я бы указал тип содержимого в теле запроса ajax

contentType: "application/json; charset=utf-8",

Хаким

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