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



>我使用 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")

位我收到构建错误,告诉我无法将字符串转换为日期时间格式。

由于这是一个新的 REST 服务,因此最好的选择是放弃 WCF 并创建使用 Web API ASP.NET 来创建 REST 服务。WCF Rest服务是一种权宜之计,承载着许多遗留行李。其中之一是他们使用的基本上被遗弃且缓慢的序列化程序。

虽然可以更改序列化程序,但这并非易事。Carlos Figueira在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服务中读取数据。应该阻止分析师和财务经理要求访问数据库。

一个很好的逐个教程是使用 Web API 2.2 创建 OData v4 终结点 ASP.NET

最新更新