Отправка long (Int64) через JSON в Службу данных WCF

У меня проблемы с выполнением запроса PUT через HTTP к службе данных WCF (OData). Проблема в удостоверении личности. Он не генерируется автоматически, и я не могу изменить настройки БД (в этом случае это не разрешено). Поэтому, когда я пытаюсь предоставить идентификатор, он отправляет правильный идентификатор, но не правильный тип...

Очевидно, служба ожидает Int64 для идентификатора и не может проанализировать мой ввод. Вот код:

 function OnCreateDisplay() {
     $('#DisplayInfoLoader').html('<span style="color: orange;">Creating object....</span>');
     $('#DisplayInfoLoader').fadeIn(1000);

     var url = "....";

     var r = new Object();
     r.DisplayID = NextDisplayID+"L";
     r.Name = $("#FDisplayName").val();
     r.Code = parseInt($("#FDisplayCode").val());
     r.Status = $("#FDisplayStatus").val();
     r.ProjectID = selected_project+"L";
     r.Description = $("#FDisplayDescription").val();
     jr = JSON.stringify(r);
     alert(jr);

     $.ajax({
         type: "PUT",
         url: url,
         data: jr,
         contentType: "application/json; charset=utf-8",
         success: function (result) {
             $('#DisplayInfoLoader').html('<span style="color: green;">Display created....</span>');
             $('#DisplayInfoLoader').fadeOut(3000);
         },
         error: function (xhr, ajaxOptions, thrownError) {
             alert(xhr.responseText);
             $('#DisplayInfoLoader').html('<span style="color: red;">An Error occured....</span>');
             $('#DisplayInfoLoader').fadeOut(3000);
         }
     });

     LoadProjectDisplays();

     return false;
 }

функция NextDisplayID() просто получает последний вставленный идентификатор и увеличивает его. Отлично работает. Я попытался добавить +"L" после него (WCF любит это долго...), но он просто не будет анализироваться!

РЕДАКТИРОВАТЬ:

Я отправляю эту строку JSON:

{"DisplayID":"132L","Name":"Name","Code":"Code","Status":"0","ProjectID":"1L","Description":"Descr"}

По этому адресу: "http: //" + ip + ": 8989 / Service.svc / Displays (" + NextDisplayID + "L)"

IP является локальной сетью 192.168.0.191

Кроме того, когда я продолжаю играть с кодом... Иногда я получаю "Ресурс не найден для сегмента" Отображает ". как ошибка

PUT HEADER:

PUT /Service.svc/Displays(132L) HTTP / 1.1

Host: 192.168.0.191:8989

Подключение: keep-alive

Длина контента: 110

Происхождение: http://192.168.0.191:8989/

X-Requested-With: XMLHttpRequest

Пользователь-агент: Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.11 (KHTML, как Gecko)

Chrome / 17.0.963.56 Safari / 535.11

Тип контента: приложение / JSON; кодировка =UTF-8

Принять: /

Реферер: http://192.168.0.191:8989/

Accept-Encoding: gzip, deflate, sdch

Accept-Language: en-GB, nl; q = 0,8

Accept-Charset: ISO-8859-1, utf-8; q = 0,7,*;q=0,3

TEXT: DATA example {"DisplayID": "132L", "Name": "fdsafsda", "Code": "dsafsda", "Status": "0", "ProjectID": "1L", "Description": " fdsafsad "}

TNX для чтения этого

2 ответа

Решение

Int64 сериализуется в JSON как число, записанное в виде строки. Так например "12345" (включая кавычки). Это описано здесь: http://www.odata.org/developers/protocols/json-format

Обратите внимание, что он отличается от формата, используемого в URL, где форматом является число, за которым следует L (который вы уже используете).

Что касается POST или PUT, они имеют разное значение.

POST используется для создания новой сущности и отправляется на URL набора сущностей, поэтому.../ Отображает

PUT используется для обновления существующего объекта и отправляется на URL-адрес экземпляра объекта (объект, который вы хотите обновить), поэтому.../ Отображение (1234L). Также обратите внимание, что обновление свойства ключа (в вашем случае DisplayID) обычно не допускается, и сервер, скорее всего, будет игнорировать значение, которое вы отправляете от клиента в PUT. Таким образом, вы можете оставить его вне полезной нагрузки в случае PUT.

Попробуйте использовать POST вместо PUT... потому что это также для создания предметов. Возможно, вам придется настроить URL и, возможно, попробовать отправить с или без DisplayID?

Другие вопросы по тегам