Отправка 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?