2009-10-17 160 views
1

有没有人对将客户端连接到SQL Server以获取数据的最佳方式有任何意见。客户端通过Internet访问SQL Server

所以可以说我有一个C#中的DataGridView不是内部网络上的WinForm的,我需要用大量的数据加载它。

目前访问我们在打开一个与SQL服务器的连接,客户端调用组件SqlDataAdapter的数据,加载一个DataSet,然后关闭数据库连接。这是使用SQL Server身份验证,并有许多应用程序在同一时间以相同方式连接到互联网上。

所以我想提高安全性,不降低性能。我应该看看哪些选项或其他选项?

- 连接方式相同,但保持连接打开的应用程序用户的持续时间。

- 创建WebServices服务器并将数据集或集合传递给客户端。

- 创建WCF服务器并连接到数据库。 (LINQ,Identify Framework,ADO.NET ...?)

- 同时创建WebServices和WCF服务器,客户端连接到WCF,WCF从连接到SQL Server的WSE服务器获取数据并将集合或数据集传递回客户端

就我个人而言,我最喜欢最后的选择有几个原因。 1.很容易将我们已经构建的组件放到Web服务中。 2.它可以让我们停止让我们的ASP.NET网站直接访问数据库,但通过Web服务器(ASMX到ASMX =好?)连接。 3.我们可以更好地控制访问哪些数据并将其提供给我们的网络之外。我们不再需要在应用程序中保留连接字符串。

有没有人有这些经验或这些选项的组合?我有些谨慎,因为我听说过像这样的服务器的恐怖故事是漏斗点,当没有问题直接连接到SQL Server时。

感谢

杰森·斯通

-

回答

3

在我看来,你需要一个非常有说服力的理由,以允许从您的网络外部数据库的直接连接。如果不正确,允许远程Sql连接可能会带来很大的安全风险。业内人士了解到这与而SQL Slammer病毒等艰辛的道路......

的WinForms/WPF客户端应用程序 - > WCF - >数据库的作品真的很好在现实世界中。此外,只要数据形状来回传递保持不变,隐藏访问远程应用程序服务后面的数据就可以更改数据库和相关对象,而无需更改任何客户端。

在另一面,有从一个逻辑实例成为很多并发用户的任何应用程序(如Web应用程序/网站去)应直接连接到数据库。

在任何一种情况下,我实在看不出有另一套网络服务,从您的WCF和Web应用程序隐藏数据库,除非我们是在谈论一个巨大的不同企业系统的价值。

+0

我们已经有了我们的Web服务的Intranet应用程序和我们的外部的WinForms已经有很好的组件组织所有的数据访问。因此,在我的测试示例中,我有一个Web服务项目的所有数据访问权限,然后在我的wcf应用程序中添加作为Web引用的Web客户端,然后在客户端中添加WCF服务器作为服务客户端。我有点像抽象的数据访问层,然后是安全层(WCF)。我们也可能让WCF在客户端运行其他例程。我只是不想这样做,如果它会放慢速度。 – JasonBlackwoodStone 2009-10-17 21:16:57

+0

如果WCF到WS呼叫位于同一个网络/ Intranet上,它将引入一个微小的perf命中(毫秒)。最大的开销可能是通过网络发送soap,而不是他们以前对数据库的tcp连接。我想说,如果不是每次打电话的话,你至少会介绍十分之一秒。对于大多数数据录入应用程序,它不会是客户会注意到的。如果这是一个在线视频游戏,它将是显而易见的。 – 2009-10-17 21:54:45

1

@Auger表示,再加上,通过HTTPS获得SSL证书和服务器的一切。这样它的安全性和它由IIS处理的低级别,所以你知道你获得了最好的性能。

+0

我的经理对SSL有些犹豫。他的观点是它会减慢速度。我不能自己说。我还没有注意到我自己的很大不同。 – JasonBlackwoodStone 2009-10-17 20:58:51

+0

有开销 - 这是肯定的。然而,你的老板是错误的,这是不够的被看到。不要害怕,前进。就像性能下降5倍时,它是1纳秒,现在是5纳秒。你永远不会看到差异。我保证数据库将成为您的瓶颈,而不是SSL。 – AngryHacker 2009-10-18 06:34:39

2

您是否签出ADO.NET DataServices(以前称为代号“Astoria”)?

这是一种在WCF基础上构建的WCF技术,它具有WCF的所有优点,可以让您很容易地(但选择性地和安全地)公开数据模型(通常是ADO.NET实体框架模型,但是Linq- SQL或其他技术也可以工作)作为互联网的RESTful服务。

您可以完全控制数据库的哪些部分实际在模型中表示,然后您可以在模型中拥有各种访问级别 - 您可以允许读取集合(例如,读取所有产品的列表),或者只需阅读个别项目,甚至是更新,插入或删除等内容 - 都在您的掌控之下。

使用REST界面,使用它只需浏览给定的URL,然后在该模型中进行下钻或链接。

还有一个客户端API可供使用,因此您可以轻松快速地显示数据并在数据中提供用户导航。你一定要去看看Mike Flasko和Developing Applications Using Data Services的PDC08谈话,还有Pablo Castro的Offline-Enabled Data Services and Desktop Applications

绝对是一个好主意,并且是一种非常快速且安全的方式,可将您的数据上传到互联网!一探究竟。

马克

+0

看起来很有趣。我不确定我们是否真的要重写迄今为止所做的一切。如果我们只需将所有组件拖放到Web服务中,客户端就不需要改变它们的工作方式,只需添加服务引用并从组件名称中将全部替换为服务名称即可。可能是一个好主意,但我认为现在对WCF的改变是一个足够大的改变。之后我们可以转向本周的数据访问。我确信只要在那一天到来,WCF就会帮助你。 – JasonBlackwoodStone 2009-10-18 01:24:51

+0

同意 - 在这种情况下,我肯定会推荐使用WCF(不要在ASMX或其他弃用技术上投入时间和精力),我会尝试将您的数据集更改为列表,其中您使用的实体被定义为WCF数据合同。这使得WCF中最清晰的数据传输 - 不要推荐序列化DataSet - **。 – 2009-10-18 10:54:23

+0

列表会很好,但我们的程序现在都使用数据库中的大量数据。创建列表所有这些将是一场噩梦。现在,如果我们想向DataGridView添加新数据,那么我们只需将该项添加到SQL存储过程中的select语句中即可,并且它将显示在datagridview的UI中。是的,它不会像数据网格中的其他列一样漂亮,因为它没有被定义为datagridview中的列,但是如果我们需要在下一个版本之前不释放代码,那么我们可以在那里获取数据。 – JasonBlackwoodStone 2009-10-18 16:00:14