I know that are a lot of posts about consuming a WCF REST through JQuery/JSON, but I can't get it to work. I'm currently stuck at a date parameter. Below is my C# method:
[OperationContract]
[WebInvoke]
[TransactionFlow(TransactionFlowOption.Allowed)]
string GoodRegister(DateTime pDtTimeStampTransac, Int32 pIDResource, Decimal pQty, enQtyLogType pQtyGoodLogType);
Below is my JavaScript code:
/// <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);
}
My first problem is that I keep getting a date serialization 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
It says it doesn't start/end the way it's starting and ending.
My second question is: Will I have to get ride of the enumerator, or is there a way to send it?
Alsalaam Aleykum.
All you have to do is to respond to the error. I mean change the date format so the json can parse it to the web service.
your code should look like this:
I pulled out a lot of hair and shed plenty a tear over this but this worked. I modified the date formatting in your toMSJSON function. WCF accepts this format which I realised thanks to Rick Strahl.
You also need to convert the dates to UTC time or you get all kinds of funny stuff, so:
Hope this helps.
Here's a mostly seemless solution from This post (modified) which you'd put on the client with JSON.stringify():
Which works in the latest IE, Chrome, and Firefox for me.
Check out JSON.stringify (a native method) and the replacer parameter for hints on converting your enum.
There should be a generic method to format the date properly before passing to the wcf.
The method could look like this:
However now if you post it would append the offset value based on the actual timezone from where you are posting.So in order to avert this you could then adjust the offset accordingly.
According to: http://msdn.microsoft.com/en-us/library/bb412170.aspx
Your enumerator should be fine.
Building over the answer by @vas above:-
WCF receives the date in proper format. Important addition is how we passed the date in JSON as a string. Can be further simplified as follows by combining the key and start of /Date string