我对SignalR有一个奇怪的问题,我有一个简单的集线器接受这样的模型:
public class Entry
{
public string Version { get; set; }
public Guid PersistedId
{
get { return Id; }
set { Id = value; }
}
public Guid Id { get; set; }
public Guid ParentId { get; set; }
[Required]
public string Content { get; set; }
public DateTime DateCreated { get; set; }
public Guid CreatorAccountId { get; set; }
}
然后我查看请求对象,转到服务器的帖子是:
{"H":"entryhub","M":"SendEntry","A":["{\"Version\":\"1.0.0\",\"PersistedId\":\"00000000-0000-0000-0000-000000000000\",\"ParentId\":\"1764a2e3-ff6f-4a17-9c5f-d99642301dbf\",\"Content\":\"test\",\"DateCreated\":\"2013-07-21T14:06:01.980Z\",\"CreatorAccountId\":\"00000000-0000-0000-0000-000000000000\"}"],"I":2}
我一直收到异常的回复:
{"I":"2","E":"Error converting value \"{\"Version\":\"1.0.0\",\"PersistedId\":\"00000000-0000-0000-0000-000000000000\",\"ParentId\":\"1764a2e3-ff6f-4a17-9c5f-d99642301dbf\",\"Content\":\"test\",\"DateCreated\":\"2013-07-21T14:06:01.980Z\",\"CreatorAccountId\":\"00000000-0000-0000-0000-000000000000\"}\" to type 'SharedPlugin.Models.Entry'. Path '', line 1, position 266.","T":" at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureType(JsonReader reader, Object value, CultureInfo culture, JsonContract contract, Type targetType)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)\r\n at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)\r\n at Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader, Type objectType)\r\n at Newtonsoft.Json.JsonSerializer.Deserialize(TextReader reader, Type objectType)\r\n at Microsoft.AspNet.SignalR.Json.JRawValue.ConvertTo(Type type)\r\n at Microsoft.AspNet.SignalR.Hubs.DefaultParameterResolver.ResolveParameter(ParameterDescriptor descriptor, IJsonValue value)\r\n at System.Linq.Enumerable.<ZipIterator>d__7a`3.MoveNext()\r\n at System.Linq.Buffer`1..ctor(IEnumerable`1 source)\r\n at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)\r\n at Microsoft.AspNet.SignalR.Hubs.DefaultParameterResolver.ResolveMethodParameters(MethodDescriptor method, IList`1 values)\r\n at Microsoft.AspNet.SignalR.Hubs.HubDispatcher.InvokeHubPipeline(IHub hub, IJsonValue[] parameterValues, MethodDescriptor methodDescriptor, HubRequest hubRequest, StateChangeTracker tracker)"}
现在我想也许是Json.net有底层序列化的问题,但是我写了一个单元测试,从post请求中获取完全相同的json字符串,并将其反序列化为Entry对象,并且它工作正常。 / p>
我已经在线查看但似乎没有太多关于错误的信息。我认为它可能是日期,但已经尝试设置我自己的JsonNetSerializer`并改变它处理日期,空值,缺少成员等的方式,但似乎没有任何帮助,并且在单元测试中它没有默认设置以外的设置工作得很好,所以这意味着它不是Json.net的问题。
答案 0 :(得分:0)
发现问题,它是双序列化,因为我在我的对象而不是ko.toJS上调用ko.toJSON。
ko.toJSON - 这会生成一个表示视图模型的JSON字符串 数据。在内部,它只是在您的视图模型上调用ko.toJS,然后使用浏览器的本机&gt;关于结果的JSON序列化程序。注意:为了能够在没有本机JSON的旧浏览器上工作&gt;序列化器(例如,IE 7或更早版本),您还必须引用json2.js库。
ko.toJS - 这会克隆你的视图模型的对象图,代替每个可观察的&gt;该可观察值的当前值,因此您将获得仅包含您的数据且不包含&gt;的纯文本副本与淘汰相关的文物
只有在与dfowler交谈之后,才意识到这种情况并且请求数据将json显示为单个字符串,而不是预期的完整json对象。所以不要双重序列化!