Отправка long (Int64) через JSON в службу данных WCF - PullRequest
0 голосов
/ 07 марта 2012

У меня проблемы с выполнением запроса 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 любит это долго ...), но он просто не будет анализироваться!

EDIT:

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

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

По этому URL: "http://" + ip +": 8989 / Service.svc / Displays ("+ NextDisplayID +" L) "

IP - это локальный IP-адрес 192.168.0.191

Также, когда я продолжаю играть с кодом ... Иногда я получаю «Ресурс не найден для сегмента« Показы »». как ошибка

PUT HEADER:

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

Хост: 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

Content-Type: application / 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

ТЕКСТ: ДАННЫЕ пример { "DisplayID": "132L", "Имя": "fdsafsda", "Кодекс": "dsafsda", "Статус": "0", "ProjectID": "1 литр", "Описание": "fdsafsad"}

tnx для чтения

Ответы [ 2 ]

0 голосов
/ 08 марта 2012

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

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

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

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

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

0 голосов
/ 07 марта 2012

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

...