4

我正在尝试将 aDateTime作为参数发送到通过带有 JSON 编码的 WCF RESTful 服务公开的方法。请求如下所示:

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"}

我尝试了几种格式DateTime

  • 2010-07-01T10:54:00(由WCFTestClient应用程序通过 NET.TCP 发送并获得结果
  • \/Date(12345678+0100)\/
  • 01.07.2010 10:54:00

方法定义:

LogEntry[] GetLogEntriesByModule(
    string module,
    DateTime lowerDate,
    DateTime upperDate,
    int maxEntries,
    out bool maxEntriesReached
)

我总是得到以下回应:

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}

似乎DateTime没有正确解析,因为当时 Llog 中有几个条目。

有谁知道如何做到这一点?

更新:问题出在服务器端并已解决。

4

4 回答 4

7

将日期发布到 WCF 服务的正确格式是: /Date(53244000000)/ 其中括号中的数字是自 1970 UTC 午夜以来的毫秒数。

Date dt = new Date();
long date = Date.UTC(dt.getYear(), dt.getMonth(), dt.getDay(), dt.getHours(),dt.getMinutes(), dt.getSeconds());
String senddate = "/date("+date+")/";

然后如下使用它

inputparam.put("DateTime", datetime);
于 2011-03-01T11:35:36.997 回答
2

以防万一这有助于某人:

根据微软的说法,WCF 使用QueryStringConverter来进行 url 解析。因此,使用此代码(对 msdn 示例稍作修改):

QueryStringConverter converter = new QueryStringConverter();
if (converter.CanConvert(typeof(DateTime)))
{
    string strValue = converter.ConvertValueToString(DateTime.UtcNow, typeof(DateTime));
    Console.WriteLine("the value = {0}", strValue);
}

我们得到了 DateTime REST 参数的正确格式:2010-01-01T01:01:01Z

我确实读到您尝试过这种格式,但只是想确认这确实是它应该工作的方式。我想回答这个问题,因为我在搜索这个时首先出现了这个问题。

这对我使用 .NET 4.0 有效

于 2010-10-26T03:49:22.183 回答
0

我必须更新这个问题的答案,我需要做同样的事情并且我使用了接受的答案但获得的日期是错误的,它给了我一周前的日期(不知道为什么)。我对 Java 的 Date 类型了解不多,但我知道他们的一些方法已被弃用。

有人说我认为这是这种情况的最新正确答案。希望帮助别人

import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;

.....

    final Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("GMT"));        
    cal.setTime(value); // Where Value is a Date
    final long date = cal.getTime().getTime();
    final String senddate = "/Date("+date+")/";

注意 Date 与大写 "D"的使用,这也是需要的,因为它会导致 WCF 出现问题(至少在我的情况下,仅小写 D 就被卡住了很多)

我正在使用它来使用带有 JSON 的 Jackson 库的 RESTful WCF。

要添加完整的答案,可以将这种方式用于您希望与杰克逊一起序列化的日期。

import java.io.IOException;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;

import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.annotate.JsonCreator;
import org.codehaus.jackson.map.SerializerProvider;
import org.codehaus.jackson.map.ser.std.SerializerBase;

/**
 * @author HECTOR
 *
 */
public class SerializeRESTDate extends SerializerBase<Date> {

    public SerializeRESTDate() {
        // TODO Auto-generated constructor stub
        this(Date.class);
    }

    @JsonCreator
    protected SerializeRESTDate(Class<Date> t) {
        super(t);
        // TODO Auto-generated constructor stub
    }



    @Override
    public void serialize(Date value, JsonGenerator jgen,
            SerializerProvider provider) throws IOException,
            JsonGenerationException {


        final Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("GMT"));            
        cal.setTime(value);
        final long date = cal.getTime().getTime();
        final String senddate = "/Date("+date+")/";
        jgen.writeString(senddate);

    }



}

并在你的类的属性定义中像这样使用它

@JsonSerialize(using = SerializeRESTDate.class)
    @JsonProperty("InspectionDate")
    /**
     * @return the _InspectionDate
     */
    public Date get_InspectionDate() {
        return _InspectionDate;
    }
于 2013-07-19T21:09:24.737 回答
0

这是我用来从 Android Java 发送到 .NET WebApp 的代码。在 W3C XML 模式中创建一个带有日期的 JSON 对象:

Calendar myCalendarObj = Calendar.getInstance(); // Snap a moment in time

JSONObject jObj = new JSONObject(); // Create a JSON object (org.json.JSONObject)

SimpleDateFormat jsonDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); // from java.text.SimpleDateFormat
String senddate = jsonDateFormat.format(myCalendarObj.getTime());
jObj.put("a_date_field", senddate);
于 2016-04-17T09:32:16.770 回答