Выполнение вызова страницы, которая возвращает JSON с использованием ASP.net AJAX - PullRequest
0 голосов
/ 09 февраля 2010

У меня есть страница, которая ожидает запрос POST и возвращает JSON. По сути, это страница .ashx, но это не имеет значения.

При использовании jQuery я бы использовал jQuery.Post с "json" в качестве dataType, чтобы просто выполнить запрос POST и получить объект обратно. Однако для текущего проекта я в основном использую ASP.net AJAX и не хочу добавлять jQuery только для вызова.

Для ASP.net AJAX я нашел информацию только о том, как вызвать «традиционный» веб-сервис, что означает добавление asp: ServiceReference к ScriptManager и наличие «реального» веб-сервиса в конце.

Есть ли более простой способ сделать POST-вызов страницы? Я мог бы жить с получением необработанного JSON, а затем вручную eval () его, но я не хочу создавать полноценный веб-сервис asmx (развертывание их на SharePoint немного болезненно, и мой обработчик ashx работает отлично)

Ответы [ 3 ]

2 голосов
/ 09 февраля 2010

Sys.Net.WebServiceProxy.invoke (url, methodName, useGet, parametersDictionary, onSuccess, onFailure, userContext, timeout);

Все параметры необязательны, кроме первого.

parametersDictionary похож на {foo: bar} - параметры будут отправлены как JSON в теле, если вы публикуете, или как параметры в строке запроса, если это GET (каждый параметр отдельно json сериализован - что означает btw строки выглядят как "foo", с кавычками).

onSuccess, если обратный вызов принимает данные в качестве первого параметра (уже десериализованный объект).

onFailure получает объект ошибки в качестве первого параметра, который содержит метод get_message () для получения сообщения об ошибке и некоторые другие вещи.

1 голос
/ 09 февраля 2010

Вы можете напрямую использовать метод invoke класса Sys.Net.WebServiceProxy .

Подпись метода выглядит следующим образом:

invoke(path, methodName, useHttpGet, parameters, succeededCallback, failedCallback, userContext, timeout);

Если предположить, что ваш сервис действительно возвращает JSON, тогда первый аргумент successededCallback должен быть объектом JSON.

0 голосов
/ 09 февраля 2010

Sys.Net.WebServiceProxy не помог, потому что в конце концов он ожидал реального веб-сервиса - Request.Form на стороне сервера был пустым, parametersDictionary, похоже, игнорируется. Также, похоже, нет переопределения для подключения другого исполнителя.

Теперь я решил эту проблему, вручную создав Sys.Net.WebRequest . Я собираюсь взглянуть на исходные коды jQuery, так как этот подход намного более сложный / «голый металл», но, как уже было сказано, я не хочу добавлять зависимость от jQuery, если он не нужен.

var ApplicationFunctions = {
    showDialog: function(someParam, someOtherParam) {
        var sb = new Sys.StringBuilder("Do you really want to do '");
        sb.append(someParam);
        sb.append("' ?");
        var msg = sb.toString();
        if (confirm(msg)) {
            var myWebRequest = new Sys.Net.WebRequest();
            myWebRequest.set_url('SomeService.ashx');
            myWebRequest.set_httpVerb('POST');
            // Manually build POST body. This would need escaping/urlencoding
            // I think if I couldn't guarantee that the parameters are 'clean'
            var bodySb = new Sys.StringBuilder("postParam=");
            bodySb.append(someParam);
            bodySb.append("&anotherPostParam=");
            bodySb.append(someOtherParam);
            var body = bodySb.toString();
            myWebRequest.set_body(body);
            myWebRequest.get_headers()["Content-Length"] = body.length;
            // also check out usercontext to pass additional data into the completed function
            // http://msdn.microsoft.com/en-us/library/bb397436.aspx
            myWebRequest.add_completed(ApplicationFunctions.onCallCompleted);
            myWebRequest.set_timeout(10 * 1000); // 10 seconds
            myWebRequest.invoke();
        }
    },
    onCallCompleted: function(response) {
        if (response.get_timedOut()) {
            alert("Timed Out!");
            return;
        }
        if (response.get_statusCode() !== 200) {
            alert("Status Code not OK");
            return;
        }
        if (!response.get_responseAvailable()) {
            alert("No data available?!");
            return;
        }
        // Better use a JSON parser
        // http://www.json.org/js.html
        var responseData = eval('(' + response.get_responseData() + ')');
        alert("Success: " + responseData.SomeField);
    }
}
...