Datetime 信号器日期时间反序列化错误

Datetime 信号器日期时间反序列化错误,datetime,deserialization,signalr,Datetime,Deserialization,Signalr,我使用signar将一个对象从客户端发布到服务器,该对象包含一个日期属性,该属性有时有UTC日期时间,有时有本地日期时间(这本身是一个单独的问题)。我注意到,只要日期是本地时间,例如“2013-01-08T10:35:59.8484157+00:00”,就会出现“无法将字符串转换为日期时间”错误。经检查,试图解析的字符串似乎丢失了时区偏移信息中的“+”字符,从而导致转换错误。我试图理解这个角色是如何消失的 SignalR将对象正确地序列化为json,并对其进行编码,因为+字符编码为%2B,这可以

我使用signar将一个对象从客户端发布到服务器,该对象包含一个日期属性,该属性有时有UTC日期时间,有时有本地日期时间(这本身是一个单独的问题)。我注意到,只要日期是本地时间,例如“2013-01-08T10:35:59.8484157+00:00”,就会出现“无法将字符串转换为日期时间”错误。经检查,试图解析的字符串似乎丢失了时区偏移信息中的“+”字符,从而导致转换错误。我试图理解这个角色是如何消失的

SignalR将对象正确地序列化为json,并对其进行编码,因为+字符编码为%2B,这可以在SignalR请求的主体中看到

data=%7B%22H%22%3A%22alertshub%22%2C%22M%22%3A%22AcknowledgeAlert%22%2C%22A%22%3A%5B%7B%22Id%22%3A%22e2d65f79-6a03-4094-a00f-99fcd9b46a7a%22%2C%22StartDateTimeUtc%22%3A%222013-01-08T10%3A26%3A44.0849463%2B00%3A00%22%2C%22EndDateTimeUtc%22%3Anull%2C%22AcknowledgedDateTimeUtc%22%3Anull%2C%22Description%22%3A%22Test+Alert+17%22%7D%5D%2C%22I%22%3A0%7D
通过UrlDecode函数运行此函数将返回正确的值

data={
    "H":"alertshub",
    "M":"AcknowledgeAlert",
    "A":[{
            "Id":"e2d65f79-6a03-4094-a00f-99fcd9b46a7a",
            "StartDateTimeUtc":"2013-01-08T10:26:44.0849463+00:00",
            "EndDateTimeUtc":null,
            "AcknowledgedDateTimeUtc":null,
            "Description":"Test Alert 17"
    }],
    "I":0
}
但是,当查看signarrequest上下文时,主体具有列表“+”,现在是一个空格。这会导致日期转换错误。似乎SignalR/JSON.NET/.NET(不确定是哪一个)沿线的某个地方正在双重解码发布的数据,并将+转换为一个空格

我已经创建了一个简单的MVC应用程序来演示这个问题,它在GitHub上运行

一旦示例应用程序运行,单击任何带有UTC日期的警报旁边的确认按钮,这将调用集线器上的信号器方法,警报将消失。如果对具有本地日期的警报执行相同的操作,则该操作将失败(单击“创建新警报”按钮,它将随机生成具有UTC或本地日期的警报)。浏览器控制台将显示有关转换失败的错误。但如果没有,收到的错误如下:

[10:36:04 GMT+0000 (GMT Standard Time)] SignalR: Could not convert string to DateTime: 2013-01-08T10:35:53.1401147 00:00. Path 'StartDateTimeUtc', line 1, position 144.
   at Newtonsoft.Json.JsonReader.ReadAsDateTimeInternal()
   at Newtonsoft.Json.Linq.JTokenReader.ReadAsDateTime()
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadForType(JsonReader reader, JsonContract contract, Boolean hasConverter)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
   at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
   at Microsoft.AspNet.SignalR.JTokenValue.ConvertTo(Type type)
   at Microsoft.AspNet.SignalR.Hubs.DefaultParameterResolver.ResolveParameter(ParameterDescriptor descriptor, IJsonValue value)
   at System.Linq.Enumerable.<ZipIterator>d__7a`3.MoveNext()
   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at Microsoft.AspNet.SignalR.Hubs.DefaultParameterResolver.ResolveMethodParameters(MethodDescriptor method, IJsonValue[] values)
   at Microsoft.AspNet.SignalR.Hubs.HubDispatcher.InvokeHubPipeline(IHub hub, IJsonValue[] parameterValues, MethodDescriptor methodDescriptor, HubRequest hubRequest, StateChangeTracker tracker)

jquery....min.js (line 10)
[10:36:04 GMT+0000(GMT标准时间)]信号器:无法将字符串转换为日期时间:2013-01-08T10:35:53.1401147 00:00。路径“StartDateTimeUtc”,第1行,位置144。
位于Newtonsoft.Json.JsonReader.ReadAsDateTimeInternal()处
位于Newtonsoft.Json.Linq.JTokenReader.ReadAsDateTime()处
位于Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadForType(JsonReader、JsonContract契约、布尔hasConverter)
位于Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(对象newObject、JsonReader、JSONObject合同、JsonProperty成员、字符串id)
位于Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader阅读器,类型objectType,JsonContract契约,JsonProperty成员,JsonContainerContract容器契约,JsonProperty容器成员,对象existingValue)
位于Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader阅读器,类型objectType,JsonContract合同,JsonProperty成员,JsonContainerContract容器合同,JsonProperty容器成员,对象existingValue)
在Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader阅读器,类型objectType,Boolean checkAdditionalContent)
位于Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader,类型objectType)
位于Microsoft.AspNet.signal.JTokenValue.ConvertTo(类型)
位于Microsoft.AspNet.signal.Hubs.DefaultParameterResolver.ResolveParameter(ParameterDescriptor描述符,IJsonValue)
at System.Linq.Enumerable.d_u7a`3.MoveNext()
在System.Linq.Buffer`1..ctor处(IEnumerable`1源)
at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1源)
位于Microsoft.AspNet.signal.Hubs.DefaultParameterResolver.ResolveMethodParameters(MethodDescriptor方法,IJsonValue[]值)
位于Microsoft.AspNet.signal.Hubs.HubDispatcher.InvokeHubPipeline(IHub-hub,IJsonValue[]参数值,MethodDescriptor-MethodDescriptor,HubRequest-HubRequest,StateChangeTracker-tracker)
jquery….min.js(第10行)

提前感谢

这已在最新的SignalR开发分支中通过问题解决。

感谢Taylor Mullen,我正要回答我自己的问题,我发现了同样的问题,但你也打败了我。