使用日期将 JQuery JSON 发送到 WCF REST

Posted

技术标签:

【中文标题】使用日期将 JQuery JSON 发送到 WCF REST【英文标题】:Send JQuery JSON to WCF REST using date 【发布时间】: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 

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

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

【问题讨论】:

【参考方案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  + ')\/"  ';

【讨论】:

以上是关于使用日期将 JQuery JSON 发送到 WCF REST的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 数据从 JQuery 发送到 WCF REST 方法时出现问题

WCF POST 通过 JQuery。如何在 JSON 中发送数组?

从jquery发送数据到wcf Web服务

将 JSON 发送到 WCF Rest 服务 - 对象始终为空

将 jQuery 中的 WCF 作为 JSON 使用

将 JSON 发送到 C# WCF 服务会导致:请求实体太大