C# 信号器参数序列化问题

C# 信号器参数序列化问题,c#,json.net,signalr,C#,Json.net,Signalr,我对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 Pare

我对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)"}
{I:“2”,“E:“转换值时出错”{“版本”:“1.0.0\”,“PersistedId\”:“00000000-0000-0000-000000000000\”,“ParentId\”:“1764a2e3-ff6f-4a17-9c5f-d99642301dbf\”,“内容”:“测试”,“创建日期”:“2013-07-21T14:06:01.980\”,“创建者帐户”:“00000000-00000000-”\“要键入'SharedPlugin.Models.Entry'。路径',第1行,第266位,”“T:”“在Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureType(JsonReader阅读器,对象值,CultureInfo区域性,JsonContract合同,类型targetType)\r\n在Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal”(JsonReader reader,类型objectType,JsonContract contract,JsonProperty成员,JsonContainerContract containerContract,JsonProperty containerMember,对象existingValue)\r\n位于Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader,类型objectType,布尔checkAdditionalContent)\r\n位于Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader,Type objectType)\r\n位于Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader,Type objectType)\r\n位于Newtonsoft.Json.Json serializer.Deserialize(TextReader,Type objectType)\r\n位于Microsoft.AspNet.signar.Json.JRawValue.ConvertTo(Type类型)\r\n位于Microsoft.AspNet.signal.Hubs.DefaultParameterResolver.ResolveParameter(ParameterDescriptor描述符,IJsonValue值)\r\n位于System.Linq.Enumerable.d_u7a`3.MoveNext()\r\n位于System.Linq.Buffer`1..ctor(IEnumerable`1源)\r\n位于System.Linq.Enumerable.ToArray[TSource](IEnumerable`1源)\r\n位于Microsoft.AspNet.signal.Hubs.DefaultParameterResolver.ResolveMethodParameters(MethodDescriptor方法,IList`1值)\r\n位于Microsoft.AspNet.signal.Hubs.HubDispatcher.InvokeHubPipeline(IHub-hub,IJsonValue[]参数值,MethodDescriptor-MethodDescriptor,HubRequest-HubRequest,StateChangeTracker)“)
现在我认为可能是Json.net在底层序列化方面存在问题,但是我编写了一个单元测试,从post请求中获取完全相同的Json字符串,并将其反序列化到Entry对象,它工作得很好


我已经在线检查过了,但是似乎没有太多关于错误的信息。我假设它可能是日期,但是我尝试过设置我自己的JsonNetSerializer`并更改它处理日期、空值、缺少成员等的方式,但是似乎没有什么帮助,在单元测试中,它除了默认设置之外没有其他设置,工作正常,因此ies这不是Json.net的问题。

发现了问题,原因是双重序列化,因为我在我的对象上调用了ko.toJSON,而不是ko.toJS

toJSON-这将生成一个JSON字符串,表示视图模型的 数据。在内部,它只是在视图模型上调用ko.toJS,然后在结果上使用浏览器的native>JSON序列化程序。注意:要在没有native JSON>serializer的旧浏览器上工作(例如,IE 7或更早版本),还必须引用json2.js库

ko.toJS-这将克隆视图模型的对象图,用该对象的>当前值替换每个可观察对象,因此您将得到一个仅包含数据且不包含>剔除相关工件的普通副本


在与dfowler交谈之后,我才意识到情况就是这样,请求数据将json显示为单个字符串,而不是预期的完整json对象。因此,不要双重序列化!

您能扩展您的解决方案吗?我也有同样的问题。