2011-03-29 80 views
5

当考虑将面向服务的体系结构与利用SQL在查询数据时优化性能的优秀UI结合使用时,我感到有些震惊。用SQL查询Web服务

例如,ASP.NET的DevExpress网格视图非常酷,它将所有过滤,排序和分页逻辑委托给数据库服务器。但是,这假定从具有SQL能力的数据库服务器检索到的数据

如果我想在数据库和UI层之间引入Web服务层,并让UI使用Web服务来查询数据,该怎么办?

  • 如何设计Web服务和UI,以便我可以通过Web服务将过滤请求从UI传递到数据库?
  • 我是否需要提供List QueryData(string sqlQuery)样式的Web服务,并且必须自行解析SQL字符串以确保安全/访问限制?
  • 或者有没有什么好的框架或设计指导方针来承担我的这个负担?

这一定是一个非常普遍的问题,我相信它已经解决得比较充分了,对吗?

我主要感兴趣的是基于.NET/C#的或兼容的解决方案。

编辑:我找到了OData和Microsoft WCF Data Services。如果我是正确的,基于OData的应用程序可以看看如下:

  1. 用户 --- /给我1(记录1..10)/ --->ASP.NET服务器控制(当然,经由HTTP)
  2. ASP.NET服务器控制 ---/LINQ查询/ --->数据服务客户端
  3. 数据服务客户端 ---/OData的查询/ --->WCF数据服务
  4. WCF数据服务 ---/LINQ查询/ --->实体框架
  5. 实体框架 ---/SQL查询/ --->数据库

如果我有这个权利,我的DevExpress服务器控件应该能够委托一个过滤请求(例如只给我前10名)通过所有这些层到数据库,然后使用它的索引等来执行该查询。

是吗?

编辑︰看到这个线程来生活是一种喜悦:-)很难决定接受什么答案,因为所有对我来说似乎同样好......

+0

你确定你不是“只是”需要实现IQueryable并使web服务调用到后端?不熟悉组件... – 2011-03-29 07:03:06

+0

不错的问题,我一直在努力,但从来没有想出一个优雅的解决方案。在之前的实现中,我提供了一个自定义的“过滤器”参数给我的服务方法(最终被解析为WHERE子句),然后在服务中添加了一些额外的标准以确保访问限制。编辑:在这种情况下,我与Telerik Grid一起工作,它生成过滤器作为OQL查询 – Ozzy 2011-03-29 07:23:34

+0

@Vincent:实现IQueryable可能是故事的一部分,但小事一桩:它允许在表示层上使用LINQ,但它没有解决(?)如何将过滤和排序委托给DBMS的问题。 – chiccodoro 2011-03-29 15:03:57

回答

1

执行List QueryData(string sqlQuery)会使您面临无限数量的安全问题。

如果您需要根据安全访问权限进行过滤,那么OData实现也不是微不足道的,您需要在WCF服务上设置适当的授权/验证,以便您可以根据经过验证的用户进一步过滤OData查询数据。

当从WCF服务中检索数据时,实现服务器端数据操作的最简单方法是在后面的代码中拦截Grid的排序/筛选操作,然后根据什么调用WCF服务的专用方法用户在做。

+0

尽管你仍然需要在服务器端实现某种认证和授权机制。服务器端不能因伪造其他人的请求而被愚弄。 – 2011-07-13 09:18:30

2

真的很有趣的问题!我不认为有正确或错误的答案,但我认为你可以建立一些架构原则。

首先,“面向服务的体系结构”是一种架构风格,它要求您公开业务服务以供其他应用程序使用。运行数据库查询不是一项服务 - 至少在我看来。事实上,提供执行任意SQL的Web服务可能是一种反模式 - 您可能会绕过大多数数据库服务器提供的安全模型,您无法控制查询 - 编写语法正确的“选择”查询哪些数据库瘫痪(笛卡尔连接是我最喜欢的),并且Web服务协议的开销会使这种方法比通过正常访问路由查询数据库要慢几倍 - LINQ或其他。

因此,让我们假设您接受该观点 - 问题的解决方案是什么?首先,如果您想要使用DevExpress网格的生产力,您可能应该以DevExpress希望您工作的方式工作 - 如果这意味着直接查询数据库,那么这是迄今为止最好的方法。如果您想要转移到SOA,并且DevExpress网格不支持该功能,那么应该找到新的网格控件,而不是将整个企业体系结构定制为相对较小的组件。

其次 - 在结构上,你应该在哪里进行排序,过滤等?这在SQL中是一个简单的概念,但在尝试将其转换为Web服务规范时感到不愉快 - 您很快就会得到一个难以理解的方法签名(“getAccountDataForUser(userID,bool sortByDate,bool sortByValue,bool filterZeros,bool filterTransfers)” )。另一方面,对客户端执行过滤和排序是混乱和缓慢的。

我的建议是查看Specification Pattern - 这可以让您拥有干净的方法签名,但可以以一致的方式指定所需的排序和排序。

+0

我接受你的观点。 OData规范看起来有点像对这个问题的答案。它不允许任意的SQL查询,但支持过滤和排序。它甚至可能与DevExpress等组件兼容(但我仍然怀疑,从未尝试过)。 – chiccodoro 2011-07-13 12:06:28

1

“这肯定是一个很普遍的问题,我肯定它已经被解决得比较充分了,对吧?”

鉴于围绕开发者世界的皮肤猫的数量,我不得不说。

WCF数据服务提供了迄今为止我发现的最佳解决方案,但验证和授权可能会非常棘手。有一个体面的帖子,涵盖了围绕此的服务器端问题http://blogs.msdn.com/b/astoriateam/archive/2010/07/19/odata-and-authentication-part-4-server-side-hooks.aspx。设置这个并不容易,但它确实很好。