【问题标题】:Send JQuery JSON to WCF REST using date使用日期将 JQuery JSON 发送到 WCF REST
【发布时间】:2011-05-27 08:06:43
【问题描述】:

我知道有很多关于通过 JQuery/JSON 使用 WCF REST 的帖子,但我无法让它工作。我目前被困在一个日期参数上。下面是我的 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 

它说它没有按照开始和结束的方式开始/结束。

我的第二个问题是:我是否必须搭便车,或者有没有办法发送它?

【问题讨论】:

    标签: c# jquery wcf json rest


    【解决方案1】:

    我拔了很多头发,为此流下了很多眼泪,但这很有效。我在您的 toMSJSON 函数中修改了日期格式。 WCF 接受这种格式,感谢Rick Strahl

    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();
    

    希望这会有所帮助。

    【讨论】:

    • 匿名用户建议将 this.getUTCOffset() 添加到原型代码中
    【解决方案2】:

    根据:http://msdn.microsoft.com/en-us/library/bb412170.aspx

    日期时间线格式

    DateTime 值显示为 JSON 字符串,格式为“/Date(700000+0500)/”,其中第一个数字(在提供的示例中为 700000)是 GMT 时区的毫秒数,常规(非夏令时)自 1970 年 1 月 1 日午夜以来的时间。该数字可能为负数以表示较早的时间。示例中由“+0500”组成的部分是可选的,表示时间是本地类型的——也就是说,应该在反序列化时转换为本地时区。如果不存在,则将时间反序列化为 Utc。实际数字(本例中为“0500”)及其符号(+ 或 -)被忽略。

    序列化 DateTime 时,Local 和 Unspecified 时间用偏移量写入,Utc 不带偏移量写入。

    ASP.NET AJAX 客户端 JavaScript 代码自动将此类字符串转换为 JavaScript DateTime 实例。如果在 .NET 中还有其他格式相似但不是 DateTime 类型的字符串,它们也会被转换。

    只有在“/”字符被转义时才会发生转换(即 JSON 看起来像“\/Date(700000+0500)\/”),因此 WCF 的 JSON 编码器(由 WebHttpBinding 启用) 总是转义“/”字符。

    你的枚举器应该没问题。

    【讨论】:

    • 我同意...但它不起作用...我最终放弃了,并更改了我的字符串接口。奇怪的是,它似乎是正确的,一切正常,但我仍然有一个错误。
    【解决方案3】:

    这是来自This post(已修改)的一个几乎没有问题的解决方案,您可以使用 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】:

      Alsalaam Aleykum。

      您所要做的就是响应错误。我的意思是更改日期格式,以便 json 可以将其解析到 Web 服务。

      您的代码应如下所示:

             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 中的日期作为字符串传递。可以通过结合/Date字符串的key和start进一步简化如下

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-09-30
            • 1970-01-01
            • 2011-02-24
            • 2011-06-19
            • 2017-03-17
            • 1970-01-01
            • 2011-02-27
            相关资源
            最近更新 更多