WCF休息服务中的日期序列化

时间:2015-01-22 12:25:07

标签: json datetime wcf-rest

我正在使用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格式。

1 个答案:

答案 0 :(得分:1)

由于这是一个新的REST服务,最好的选择是放弃WCF并创建使用ASP.NET Web API来创建REST服务。 WCF休息服务是一项临时措施,带来了许多传统的包袱。其中之一是他们使用的很大程度上被遗弃和缓慢的序列化器。

虽然 可以更改序列化程序,但它不是一件容易的事。这个过程在Supporting different data and serialization formats in WCF由Carlos Figueira描述,并且它绝对不适合初学者。

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

这将允许您的客户在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