Вернуть JSON из веб-службы ASMX без XML-оболочки? - PullRequest
6 голосов
/ 06 декабря 2011

Мне нужно получить данные Json из веб-службы C #.

Я знаю, что есть несколько вопросов, основанных на этом, поверьте мне, я прочитал довольно много, но только чтобы сбить меня с толку.

Вот что я сделал:

В свой веб-сервис я включил: [System.Web.Script.Services.ScriptService] для класса & [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)] для метода

Я также использовалJavaScriptSerializer() для преобразования моих данных в строку

Я звоню в эту службу, используя $.getJSON()

Если я не использую это, я получаю ошибку ссылки на междоменный домен.

Для этого мне пришлось настроить службу m, чтобы получить имя функции обратного вызова, поэтому я передаю t his.Context.Request["callback"] + сериализованные данные Json;

Но в выводе я получаю его в

< string xmlns="http://XYZ...">  

Данные в тегах имеют нужный мне формат

Я также попытался установить тип содержимого с помощью: $.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/json; charset=utf-8"});

Но все равно безуспешно.

Добавлено позже: я принял ответ француза, потому что я знаю, что это правильный подход, но я все еще не могу заставить его работать ... Я просто поместил веб-сервис и веб-сайт в тот же домен и использовал xml, я знаю, что это был не лучший способ,но я потратил на это 2 дня и не мог позволить себе тратить больше.

1 Ответ

4 голосов
/ 06 декабря 2011

Используйте это:

var JsonString = ....;
$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "YourWebServiceName.asmx/yourmethodname",
    data: "{'TheData':'" + JsonString + "'}",
    dataType: "json",
    success: function (msg) {
        var data = msg.hasOwnProperty("d") ? msg.d : msg;
        OnSucessCallBack(data);
    },
    error: function (xhr, status, error) {
        alert(xhr.statusText);
    }
});

function OnSuccessCallData(DataFromServer) {
 // your handler for success    
}

, а затем на стороне сервера в коде файла, который автоматически создается в папке AppCode, вы пишете что-то вроде этого:

using System.Web.Services;
using System.Web.Script.Serialization;

    [System.Web.Script.Services.ScriptService]
    public class YourWebServiceName : System.Web.Services.WebService
    {
        [WebMethod]
        public string yourmethodname(string TheData)
        {
          JavascriptSerializer YourSerializer = new JavascriptSerializer();
          // custom serializer if you need one 
          YourSerializer.RegisterConverters(new JavascriptConverter  [] { new YourCustomConverter() });

          //deserialization
          TheData.Deserialize(TheData);

          //serialization  
          TheData.Serialize(TheData);
        }
    }

Если вы не используете пользовательский конвертер, свойства между строкой json и определением класса c # вашего объекта на стороне сервера должны совпадать, чтобы десериализация работала.Для сериализации, если у вас нет пользовательского конвертера, строка json будет включать все свойства вашего класса c #.Вы можете добавить [ScriptIgnore] непосредственно перед определением свойства в вашем классе c #, и это свойство будет игнорироваться сериализатором, если вы не укажете пользовательский конвертер.

...