我通过SignalR从ServerSide发送一个没有未指定类型的DateTime对象:
myDate.Kind //Unspecified
我按照建议here设置JsonConvert defaultSettings使用UTC:
JsonConvert.DefaultSettings = () => new JsonSerializerSettings(){
DateTimeZoneHandling = DateTimeZoneHandling.Utc
};
如果我使用JsonConvert.SerializeObject,我获得UTC ISO8601格式的字符串,后缀为“Z”:
JsonConvert.SerializeObject(myDate) // "\"2014-11-27T23:00:00Z\""
但是,如果我通过SignalR发送对象,则在客户端我收到:
myDate: "2014-11-27T23:00:00"
请注意,它返回时没有Z后缀。
SignalR没有使用JsonConvert吗? 为什么我得到两个不同的结果?
我的目标是接待客户方:“2014-11-27T23:00:00 Z ”
答案 0 :(得分:5)
SignalR使用GlobalHost对象中注册的JsonSerializer。 而不是你在做什么,添加以下内容;
var serializer = new JsonSerializer()
{
DateTimeZoneHandling = DateTimeZoneHandling.Utc
};
GlobalHost.DependencyResolver.Register(typeof(JsonSerializer), () => serializer);
不要忘记(如果需要)设置Null处理,引用处理等
答案 1 :(得分:2)
更新SignalR 2.2.0的答案,并提供一些信息放置代码,我将此代码放在Global.asax.cs中:
{ ... other using ... }
using Newtonsoft.Json;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Json;
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
{ ... other code ... }
/* Need to using UTC time for SignalR so IE and Chrome display dates correctly
* (append Z (Zulu) onto end of json timestamps) */
var settings = JsonUtility.CreateDefaultSerializerSettings();
settings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
var serializer = JsonSerializer.Create(settings);
GlobalHost.DependencyResolver.Register(typeof(JsonSerializer), () => serializer);
}
{ .. more code .. }
}
这是必需的,因此SignalR包括" Z" (祖鲁语)在datetime json值结束时。 Chrome(v44.x)处理没有Z作为UTC的日期时间,但IE11将日期时间视为本地而不是UTC。将Z添加到datetime json值的末尾使得处理在我的经验中保持一致。