我有一个WCF方法,它接收“时间戳”列表
public bool SyncTimestamps(IList<Timestamp> timestamps)
对于我的生活,我无法让客户端以对使用RestSharp感到满意的格式将值传递给主机。问题似乎与dateformatting有关。
尝试1
var request = new RestRequest("Timestamp/SyncTimestamps", Method.POST);
request.RequestFormat = DataFormat.Json;
request.AddBody(timestamps);
输出1
"[{\"ID\":1,\"JobId\":654321,\"TimestampSelected\":\"2013-08-05T13:51:13.6201529Z\",\"TimestampActual\":\"2013-08-05T13:51:13.6201529Z\",\"Type\":1,\"Active\":false}]"
错误1
DateTime content'2013-08-05T13:51:13.6201529Z'不以。开头 '/ Date('和'结束')/'作为JSON的要求。'
我读到这是RestSharp序列化程序的一个问题所以我用Json.Net替换了它,它产生了一个稍微不同的日期字符串。
尝试2
var request = new RestRequest("Timestamp/SyncTimestamps", Method.POST);
request.RequestFormat = DataFormat.Json;
request.AddBody(JsonConvert.SerializeObject(timestamps));
输出2
{application/json="[{\"ID\":1,\"JobId\":654321,\"TimestampSelected\":\"2013-08-05T14:54:33.9261815+01:00\",\"TimestampActual\":\"2013-08-05T14:54:33.9251814+01:00\",\"Type\":1,\"Active\":false}]"}
错误2
The exception message is 'Expecting state 'Element'..
Encountered 'Text' with name '', namespace ''. '. See server logs for more details.
The exception stack trace is:
at ReadArrayOfTimestampFromJson(XmlReaderDelegator , XmlObjectSerializerReadContextComplexJson , XmlDictionaryString , XmlDictionaryString , CollectionDataContract )
at System.Runtime.Serialization.Json.JsonCollectionDataContract.ReadJsonValueCore(XmlReaderDelegator jsonReader, XmlObjectSerializerReadContextComplexJson context)
at System.Runtime.Serialization.Json.JsonDataContract.ReadJsonValue(XmlReaderDelegator jsonReader, XmlObjectSerializerReadContextComplexJson context) at
有人能建议一种方法来生成一个WCF服务很乐意接受和反序列化的dateformat吗? MSDN上的文档声明需要以下格式。
DateTime值以JSON字符串的形式显示 “/ Date(700000 + 0500)/”,其中第一个数字(示例中为700000) ())是GMT时区中的常规毫秒数 (非夏令时)自1970年1月1日午夜起的时间。
更新:
我在JSON.Net中找到了一个设置,允许我将日期转换为WCF似乎要求的格式。
var settings = new JsonSerializerSettings() { DateFormatHandling = DateFormatHandling.MicrosoftDateFormat };
JsonConvert.SerializeObject(obj, settings);
这似乎完成了创建序列化字符串的工作。
{application/json="[{\"ID\":1,\"JobId\":654321,\"TimestampSelected\":\"\\/Date(1375713542908+0100)\\/\",\"TimestampActual\":\"\\/Date(1375713542908+0100)\\/\",\"Type\":1,\"Active\":false}]"}
我的服务仍然拒绝这一点,“异常消息是'期待状态'元素'..”
答案 0 :(得分:0)
除了JSON.Net之外,还有另一个JSON序列化库可以为您执行此操作:https://www.nuget.org/packages/ServiceStack.Text/
var request = new RestRequest("Timestamp/SyncTimestamps", Method.POST);
request.RequestFormat = DataFormat.Json;
var json = JsonSerializer.SerializeToString(timestamps);
request.AddParameter("application/json", json, ParameterType.RequestBody);
答案 1 :(得分:0)
你快到了。您只需手动将参数添加到请求中,绕过有故障的RestSharp序列化程序。
var request = new RestRequest("Timestamp/SyncTimestamps", Method.POST);
request.RequestFormat = DataFormat.Json;
var settings = new JsonSerializerSettings() { DateFormatHandling=DateFormatHandling.MicrosoftDateFormat };
var json = JsonConvert.SerializeObject(timestamps,settings);
request.AddParameter("application/json",json,null,ParameterType.RequestBody);