WCF Rest 服务中的日期序列化

Posted

技术标签:

【中文标题】WCF Rest 服务中的日期序列化【英文标题】:Date Serialization in WCF Rest Service 【发布时间】:2015-03-21 05:48:41 【问题描述】:

我使用 C#,我有以下 LINQ 语句

var WeeklySalesQuery = from d in db.DashboardFigures
                                 join s in outlets.Split(',').Select(x => int.Parse(x)) on d.OutletNo equals s
                                 where (d.TypeOfinformation == "SALES-TW")
                                 group d by new
                                 
                                     d.TypeOfinformation,
                                     d.Date
                                  into newGroupedresult
                                 select new Weeklysales()
                                 
                                     dt = ((DateTime)newGroupedresult.Key.Date),
                                     Sv = (double)newGroupedresult.Sum(d => d.Value_1) + (double)newGroupedresult.Sum(d => d.Value_2),
                                     KPI = 1
                                 ;

但是出来的dt格式是

"\/Date(1421884800000+0000)\/

我已尝试将代码更改为

dt = ((DateTime)newGroupedresult.Key.Date).ToString("dd.mm.yyyy")

我收到构建错误,告诉我无法将字符串转换为 DateTime 格式。

【问题讨论】:

你有 ms 格式的 json 日期时间。看这里***.com/questions/4969757/…newGroupedresult.Key.Date的类型是什么? 日期没有格式。该错误意味着您的数据库列包含字符串,而不是日期。 string's 格式表明它是从使用旧 DataContractJsonSerializer 的 Json 字符串插入的。 JSon 没有日期类型,但现在的惯例是使用 ISO 8601 格式 如果Key.Date 是一个字符串,你必须像DateTime.Parse(newGroupedresult.Key.Date) 那样做某事而不是强制转换。 @GiorgosBetsos 这行不通,也不是解决方案。 DateTime.Parse 或 ParseExact 无法识别旧的 Json 格式。 真正的解决方案是 1) 添加一个新的 datetime 或 datetimeoffset 字段来保存日期 2) 解析旧的 Json 数据并将日期存储在新的字段中 3) 删除旧的字段并重命名新的一到老的名字 【参考方案1】:

由于这是一个新的 REST 服务,最好的选择是放弃 WCF 并创建使用ASP.NET Web API 来创建 REST 服务。 WCF 休息服务是一种权宜之计,它承载了许多遗留的包袱。其中之一是他们使用的大部分被废弃且速度较慢的序列化程序。

虽然 可以更改序列化程序,但这并非易事。 Carlos Figueira 在Supporting different data and serialization formats in WCF 中描述了该过程,它绝对不适合初学者。

您发布的代码表明您正在尝试创建 REST 服务来支持 BI 仪表板。在这种情况下,您还应该在 Web API 之上考虑 OData。 OData 在数据实体上公开 REST 服务,并允许客户端使用 URL 查询参数(如过滤器、选择、组等)指定查询。

这将允许您的客户在 URL 中指定他们想要的条件和列,而无需修改您的服务代码。 OData 工作在 IQueryable 之上,因此最终执行的查询只会从数据库中提取客户想要的数据。

Visual Studio 具有允许您从任何实体框架模型轻松公开 OData 服务的向导,尽管 OData 不仅限于 EF。

客户端可以直接创建查询 URL,也可以使用 Visual Studio 生成的代理来处理 LINQ 语法或 javascript 客户端库。

最后,您不必担心客户端会发出会杀死数据库的奇怪请求。您可以仅将特定查询作为方法公开,或对将公开的 IQueryable 应用您自己的限制。

添加缓存支持也很容易,使得在分页或查看不同仪表板页面时重新访问同一页面等操作非常便宜。使用 WCF 执行此操作并非易事。

PS: Excel 也可以从 OData 服务中读取数据。应该阻止分析师和财务经理要求访问数据库。

一个很好的详细教程是Create an OData v4 Endpoint Using ASP.NET Web API 2.2

【讨论】:

以上是关于WCF Rest 服务中的日期序列化的主要内容,如果未能解决你的问题,请参考以下文章

WCF REST Web 服务 - Json 的反序列化

如何将 Json.Net 设置为 WCF REST 服务的默认序列化程序

从 WCF REST Web 服务返回包装在回调函数中的 JSON

WCF -Rest- DataContract:反序列化 XML 包装的响应

WCF Rest 服务和 protobuf-net

如何使用 wcf REST 服务获取自定义对象的 json 响应?