Отправить JQuery JSON в WCF REST, используя дату - PullRequest
18 голосов
/ 17 декабря 2010

Я знаю, что есть много сообщений о том, как использовать WCF REST через JQuery / JSON, но я не могу заставить его работать. Я в настоящее время застрял в параметре даты. Ниже мой метод C #:

[OperationContract]
[WebInvoke]
[TransactionFlow(TransactionFlowOption.Allowed)]
string GoodRegister(DateTime pDtTimeStampTransac, Int32 pIDResource, Decimal pQty, enQtyLogType pQtyGoodLogType);

Ниже мой код JavaScript:

/// <reference path="../Scripts/jquery-1.4.1-vsdoc.js" />
/// <reference path="json.js" />

Date.prototype.toMSJSON = function () {
  var date = '\\\/Date(' + this.getTime() + ')\\\/';
  return date;
};

function botaoclick() {
  var date = new Date().toMSJSON();
  var datavar = {
    'pDtTimeStampTransac': date,
    'pIDResource': 1,
    'pQty': 1
  };
  $.ajax(
  {
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "http://desk01:9876/ShopFloorService/script/GoodRegister",
    dataType: "json",
    data: JSON.stringify(datavar),
    //data: '{"pDtTimeStampTransac":date, "pIDResource":"teste", "pQty":"3"}',
    error: jqueryError,
    success: function (msg) {
      alert("back");
      var divForResult = document.getElementById("test");
      divForResult.innerHTML = "Result: <b>" + msg.d + "</b>";
    }
  }
  )
}

function jqueryError(request, status, error) {
  alert(request.responseText + " " + status + " " + error);
}

Моя первая проблема - я получаю сообщение об ошибке сериализации даты:

{"ExceptionDetail":{"HelpLink":null,"InnerException":{"HelpLink":null,"InnerException":{"HelpLink":null,"InnerException":null,"Message":"DateTime content '\\\/Date(1292616078638)\\\/' does not start with '\\\/Date(' and end with ')\\\/' as required for JSON.","StackTrace":"   at System.Runtime.Serialization.Json.JsonReaderDelegator.ParseJsonDate(String originalDateTimeValue)\u000d\u000a   at 

Он говорит, что не начинается и не заканчивается, как начинается и заканчивается.

Мой второй вопрос: придется ли мне ездить на счетчике или есть способ его отправить?

Ответы [ 6 ]

44 голосов
/ 15 марта 2011

Я вырвал много волос и пролил много слез по этому поводу, но это сработало.Я изменил форматирование даты в вашей функции toMSJSON .WCF принимает этот формат, который я осознал благодаря Рику Штролу .

Date.prototype.toMSJSON = function () {
    var date = '/Date(' + this.getTime() + ')/'; //CHANGED LINE
    return date;
};

Вам также нужно конвертировать даты в UTC или вы получаете все виды забавных вещей, поэтому:*

  var dt = ...;
  var dt1 = new Date(Date.UTC(dt.getFullYear(), dt.getMonth(), dt.getDate(),   dt.getHours(), dt.getMinutes(), dt.getSeconds(), dt.getMilliseconds()));
  var wcfDateStr = dt1.toMSJSON();

Надеюсь, это поможет.

2 голосов
/ 03 февраля 2011

Согласно: http://msdn.microsoft.com/en-us/library/bb412170.aspx

Формат провода DateTime

Значения DateTime отображаются в виде строк JSON в форме "/ Date (700000 + 0500) /", гдепервое число (700000 в приведенном примере) - это количество миллисекунд в часовом поясе GMT, обычное (без перехода на летнее время) время с полуночи 1 января 1970 года. Число может быть отрицательным для представления более ранних времен.Часть, которая состоит из «+0500» в примере, является необязательной и указывает, что время имеет локальный вид, то есть при десериализации должно быть преобразовано в местный часовой пояс.Если оно отсутствует, время десериализуется как Utc.Фактическое число (в данном примере «0500») и его знак (+ или -) игнорируются.

При сериализации DateTime локальное и неуказанное время записывается со смещением, а Utc - без.

JavaScript-код клиента ASP.NET AJAX автоматически преобразует такие строки в экземпляры JavaScript DateTime.Если в .NET есть другие строки аналогичной формы, не относящиеся к типу DateTime, они также преобразуются.

Преобразование происходит только в том случае, если экранируются символы "/" (то естьJSON выглядит как "\ / Date (700000 + 0500) \ /"), и по этой причине кодировщик JSON WCF (включается через WebHttpBinding) всегда экранирует символ "/".

Ваш перечислитель долженбудь в порядке.

0 голосов
/ 21 июня 2017

Построение ответа выше @vas: -

// OrderRecievedDateTime is a proper date string
var tStart = new Date(OrderRecievedDateTime);
// Get date in UTC (required for WCF) as morning
var start = new Date(Date.UTC(tStart.getFullYear(), tStart.getMonth(), tStart.getDate(), 0, 0, 0));
// Get the ticks
var startTicks = start.getTime();

// Now build the JSON param (**notice I am passing the date value as a string, by including within quotes. Without this it doesn't takes it**).
var paramRequest = '{ "request": { "StartDate":"' + '\/Date(' + startTicks  + ')\/"'  + ' } }';

// Hit ajax, no need of any JSON.parse or stringify
$.ajax({ ..., data = paramRequest ..});

WCF получает дату в правильном формате.Важным дополнением является то, как мы передали дату в формате JSON в виде строки.Далее можно упростить, комбинируя ключ и начало строки / Date

var paramRequest = '{ "request": { "StartDate":"\/Date(' + startTicks  + ')\/" } }';
0 голосов
/ 22 апреля 2017

Должен быть универсальный метод для правильного форматирования даты перед передачей в wcf.

Этот метод может выглядеть следующим образом:

var dateToWcf = function(input)
{
    var d = new Date(input); 
    if (isNaN(d)) return null;     
    var formattedDate = { date : "/Date(" + d.getTime() + ")/" };
    return formattedDate;
}

Однако теперь, если вы разместите сообщение, оно добавитсязначение смещения, основанное на фактическом часовом поясе, из которого вы отправляете сообщение. Чтобы избежать этого, вы можете соответствующим образом отрегулировать смещение.

var formattedDate = { date: "/Date(" + d.getTime() + d.getGMTOffset() + ")/" };
0 голосов
/ 08 сентября 2015

Alsalaam Aleykum.

Все, что вам нужно сделать, это ответить на ошибку.Я имею в виду изменить формат даты, чтобы json мог разобрать его в веб-службе.

ваш код должен выглядеть следующим образом:

       function botaoclick() {

         var date = new Date();
         date = "\/Date(" + date.valueOf() + ")\/";
         // valueOf() method Returns the primitive value of a Date object.

         var datavar = {
           'pDtTimeStampTransac': date,
           'pIDResource': 1,
           'pQty': 1
         };

         $.ajax({
           type: "POST",
           contentType: "application/json; charset=utf-8",
           url: "YOUR URL",
           dataType: "json",
           data: JSON.stringify(datavar),
           error: jqueryError,
           success: function(msg) {
             alert("back");
             var divForResult = document.getElementById("test");
             divForResult.innerHTML = "Result: <b>" + msg.d + "</b>";
           }
         })
       }

       function jqueryError(request, status, error) {
         alert(request.responseText + " " + status + " " + error);
       }
0 голосов
/ 11 апреля 2013

Вот, в общем-то, простое решение из Это сообщение (измененное), которое вы бы положили на клиента с помощью JSON.stringify ():

jsonData = JSON.stringify([new Date()], 
    function (k, v) { return this[k] instanceof Date ? '/Date(' + v + ')/' : v; });

Который работает в последних версиях IE, Chrome и Firefox для меня.

Проверьте JSON.stringify (собственный метод) и параметр replacer для подсказок при преобразовании вашего перечисления.

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