[ScriptMethod (ResponseFormat = ResponseFormat.Json)] - PullRequest
6 голосов
/ 17 мая 2010

В веб-сервисе ASP.net, если выше не указано, какой формат ответа по умолчанию? Также, если мой веб-сервис ниже:

[WebMethod()]
        public List<Sample> GenerateSamples(string[][] data)
        {
            ResultsFactory f = new ResultsFactory(data);

            List<Sample> samples = f.GenerateSamples();
            return samples;
        }

возвращает список объектов. Если я изменю формат ответа на JSON, мне придется изменить тип возвращаемого значения на строку, тогда как мне получить доступ к объектам в моем JavaScript?

В настоящее время я вызываю этот веб-сервис в моем JS, например:

 $.ajax({
    type: "POST",
    url: "http://localhost/TemplateWebService/Service.asmx/GenerateSamples",
        data: jsonText,

        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(response) {
            var samples = (typeof response.d) == 'string' ? eval('(' + response.d + ')') : response.d;

            if (samples.length > 0) {
                doSomethingHere(samples);
            } else {
                alert("No samples have been generated");
            }



        },

        error: function(xhr, status, error) {
            var msg = JSON.parse(xhr.responseText);
            alert(msg.Message);
        }

    });

Что я заметил, хотя, хотя все работает отлично, оператор eval никогда не выполняется, а это означает, что веб-сервис всегда возвращает строку!

Итак, мой вопрос: [ScriptMethod (ResponseFormat = ResponseFormat.Json)] необходим на стороне определения веб-службы?

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

Я взял основы объединения ajax Jquery с asp.net со стороны Encosia, и тип ответа там не упоминался - я читал его на другом сайте и не уверен, насколько он важен.

http://www.codeproject.com/KB/webservices/JsonWebServiceJQuery.aspx

Перечисляет 4 различных изменения на стороне веб-службы asp.net. У меня есть только первые 2 - в моем web.config. Сам сервис и класс Sample реализованы без какой-либо сериализации, хотя и имеют свойства. Я предполагаю, что веб-сервис по умолчанию является JSON? И пока ваши объекты имеют свойства, они по умолчанию сериализуемы? Это было мое понимание, пока я не прочитал эту статью.

1 Ответ

7 голосов
/ 20 мая 2010

Атрибут ResponseFormat не обязателен. Включая настройки клиента и сервера, для этого требуется всего четыре вещи:

  • Добавьте ScriptHandlerFactory HttpHandler в ваш файл web.config.
  • Украсьте свои веб-службы с помощью атрибута [ScriptService].
  • Запросить методы службы с помощью глагола POST.
  • Запрос методов службы с типом содержимого "application / json".

Когда вы делаете эти четыре вещи, ответы методов сервиса автоматически сериализуются как JSON.

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