Подтвердить что ты не робот

Отправьте JQuery JSON в WCF REST с использованием даты

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

[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 

В нем говорится, что он не запускается и не заканчивается так, как он начинается и заканчивается.

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

4b9b3361

Ответ 1

Я вытащил много волос и пролил много слез над этим, но это сработало. Я изменил форматирование даты в вашей функции 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

В соответствии с: http://msdn.microsoft.com/en-us/library/bb412170.aspx

Формат даты DateTime

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

При сериализации DateTime, Local и Unspecified times записываются со смещением, а Utc записывается без.

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

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

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

Ответ 3

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

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

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

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

Ответ 4

Альсалаам Алейкум.

Все, что вам нужно сделать, - это ответить на ошибку. Я имею в виду изменение формата даты, чтобы 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);
       }

Ответ 5

Должен быть общий метод форматирования даты, прежде чем перейти к 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() + ")/" };

Ответ 6

Построение ответа на @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 в виде строки. Может быть дополнительно упрощено следующим образом, комбинируя ключ и начало строки/Дата

var paramRequest = '{ "request": { "StartDate":"\/Date(' + startTicks  + ')\/" } }';