使用日期将 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 中发送数组?