Создание правильного сообщения JSON в C # для веб-службы MVC 2 REST - PullRequest
1 голос
/ 07 ноября 2010

Мой веб-сервис MVC2 RESTFul полностью настроен на прием JSON и возвращает некоторые из них с помощью примера, который я нашел здесь

Хорошие вещи, этот пример работает простохорошая отправка JSON через jQuery и обработка ответа JSON:

        $(function () {
        $("#personCreate").click(function () {
            var person = getPerson();

            // poor man's validation
            if (person == null) {
                alert("Specify a name please!");
                return;
            }

            var json = $.toJSON(person);

            $.ajax({
                url: '/home/save',
                type: 'POST',
                dataType: 'json',
                data: json,
                contentType: 'application/json; charset=utf-8',
                success: function (data) {
                    // get the result and do some magic with it
                    var message = data.Message;
                    $("#resultMessage").html(message);
                }
            });
        });
    });

Однако мне нужно автоматически вызывать мой веб-сервис (один сервер вызывает другой, без клиентской стороны).JQUERY здесь).Так что я делаю все это в C #:

  private static void MakeJSONServiceCall(PersonInputModel person)
    {
        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(ServiceUrl);
            request.Method = "POST";
            request.ContentType = "application/json; charset:utf-8";
            DataContractJsonSerializer ser = new DataContractJsonSerializer(person.GetType());
            MemoryStream ms = new MemoryStream();
            ser.WriteObject(ms, person);
            String json = Encoding.UTF8.GetString(ms.ToArray());
            StreamWriter writer = new StreamWriter(request.GetRequestStream());
            writer.Write(json);
            writer.Close();
        }
        catch (Exception e)
        {

        }
    }

За исключением случаев, когда DataContractJsonSerializer сериализует мой объект, я получаю мусор с кучей экранированных тегов:

"{\"<Age>k__BackingField\":24,\"<Name>k__BackingField\":\"Jordan\"}"

Не похоже на хороший JSON для меня!?

Исправлено:

"{\"Age\":24,\"Name\":\"Jordan\"}"

Класс, правильно декорированный:

[Serializable]
public class PersonInputModel {
    public string Name { get; set; }
    public int Age { get; set; }
}

Исправлено:

[DataContract]
public class PersonInputModel {
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public int Age { get; set; }
}

А потом, когда я запускаю веб-сервис и вставляю URL, он никогда не попадет, даже когда я перебираю этот код.

Что мне не хватает?

Спасибо!


При ближайшем рассмотрении с использованием Скрипач я не вижу "POST" вообще, когда я прохожу:

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(ServiceUrl); 
        request.Method = "POST"; 
        request.ContentType = "application/json; charset:utf-8"; 
        DataContractJsonSerializer ser = new DataContractJsonSerializer(person.GetType()); 
        MemoryStream ms = new MemoryStream(); 
        ser.WriteObject(ms, person); 
        String json = Encoding.UTF8.GetString(ms.ToArray()); 
        StreamWriter writer = new StreamWriter(request.GetRequestStream()); 
        writer.Write(json); 
        writer.Close(); 

Мысли

Ответы [ 2 ]

2 голосов
/ 07 ноября 2010

Вам необходимо использовать атрибуты DataContract :

[DataContract]
public class PersonInputModel {
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public int Age { get; set; }
}

Ваш существующий код сериализует сгенерированные компилятором поля поддержки, которые имеют неожиданные имена.

0 голосов
/ 08 ноября 2010

Я обновил свой код для использования IAsyncResult

В соответствии с приведенным здесь примером:

http://msdn.microsoft.com/en-us/library/system.net.webrequest.begingetrequeststream.aspx

Это решение правильно подключилось к веб-сервису и прочитало результат JSON (я думаю, что моя проблема заключалась в том, что мой сервис вернул данные JSON на стороне результатов, и я не ожидалпрочитайте его правильно!

Спасибо за помощь!

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