I'm trying to send a DateTime
as a parameter to a method exposed over a WCF RESTful service with JSON encoding. The request looks like this:
POST http://IP:PORT/LogService/json/GetLogEntriesByModule HTTP/1.1
Content-Length: 100
Content-Type: application/json
Host: IP:PORT
Connection: Keep-Alive
User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4)
Expect: 100-Continue
{"maxentries":10,"upperdate":"1280703601462","lowerdate":"1277938801462","module":"Windows Service"}
I tried several formats for the DateTime
:
2010-07-01T10:54:00
(which is send by the WCFTestClient
application over NET.TCP and it gets results\/Date(12345678+0100)\/
01.07.2010 10:54:00
The method definition:
LogEntry[] GetLogEntriesByModule(
string module,
DateTime lowerDate,
DateTime upperDate,
int maxEntries,
out bool maxEntriesReached
)
I always get the following response:
HTTP/1.1 200 OK
Content-Length: 60
Content-Type: application/json; charset=utf-8
Server: Microsoft-HTTPAPI/2.0
Date: Fri, 02 Jul 2010 09:07:04 GMT
{"GetLogEntriesByModuleResult":[],"maxEntriesReached":false}
It seems the DateTime
isn't correctly parsed, because there are several entries in the Llog for that time.
Does anyone know on how to do this?
Update: The problem was on the server side and has been resolved.
The correct format for posting dates to WCF service is using:
/Date(53244000000)/
where the number in brackets is the number of milliseconds since 1970 UTC Midnight.
Date dt = new Date();
long date = Date.UTC(dt.getYear(), dt.getMonth(), dt.getDay(), dt.getHours(),dt.getMinutes(), dt.getSeconds());
String senddate = "/date("+date+")/";
And then use it as below
inputparam.put("DateTime", datetime);
Just in case this helps somebody:
According to Microsoft, WCF uses a QueryStringConverter to do the url parsing. Thus, using this code (slight modification of the msdn example):
QueryStringConverter converter = new QueryStringConverter();
if (converter.CanConvert(typeof(DateTime)))
{
string strValue = converter.ConvertValueToString(DateTime.UtcNow, typeof(DateTime));
Console.WriteLine("the value = {0}", strValue);
}
we get the proper format for DateTime REST parameters: 2010-01-01T01:01:01Z
I did read that you tried this format, but just wanted to confirm that this is indeed the way it's supposed to work. I thought of answering since this question came up first when I searched for this.
This worked for me using .NET 4.0
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With