如何让Silverlight从MySQL获取数据
我已经在Silverlight中编写了一个小型的hello world测试应用程序,希望将其托管在Linux / Apache2服务器上。我希望数据来自MySQL(或者其他兼容Linux的数据库),以便可以将数据绑定到数据库中的数据。
我设法通过使用MySQL Connector / .NET使其工作:
MySqlConnection conn = new MySqlConnection("Server=the.server.com;Database=theDb;User=myUser;Password=myPassword;"); conn.Open(); MySqlCommand command = new MySqlCommand("SELECT * FROM test;", conn); using (MySqlDataReader reader = command.ExecuteReader()) { StringBuilder sb = new StringBuilder(); while (reader.Read()) { sb.AppendLine(reader.GetString("myColumn")); } this.txtResults.Text = sb.ToString(); }
如果我完全信任已发布的ClickOnce应用程序(或者至少为SocketPermission)并在本地运行它,则此方法很好。
我希望它在服务器上运行,但我无法使其正常运行,总是以权限异常结束(不允许使用SocketPermission)。
如果有任何区别,则数据库与Silverlight应用程序托管在同一台服务器上。
编辑
好的,我现在了解了为什么在客户端应用程序中拥有数据库凭据(显然)是一个坏主意。人们如何做到这一点呢?我们如何保护代理Web服务,以使其以安全的方式在客户端/数据库之间中继数据?网上是否有任何示例?
当然,我不能成为第一个想要使用数据库来驱动Silverlight应用程序的人吗?
解决方案
Silverlight没有任何直接访问数据库服务器的功能。我们可以做的是通过Web服务(ASMX或者WCF,甚至是非.NET!)公开数据库操作,并使用Silverlight访问这些服务。
从客户端直接将DB连接到服务器通常是一个坏主意。我不知道反编译Silverlight应用程序有多么容易,但是我认为这在某种程度上是可能的。然后,我们基本上就是将数据库凭据提供给用户。
做我们想要做的最简单的方法(现在已经阅读了所有的编辑内容:))是公开可以使用的服务。微软现在真正推动的模式是公开WCF服务,但事实是Silverlight客户端可以使用WCF来使用许多不同类型的服务。
我们现在最容易做的就是在Web服务器上使用.NET服务或者PHP REST服务,然后将Silverlight应用程序指向该服务。这样,我们不仅可以保护数据库免受人们窥探数据库的侵害,而且更重要的是,还可以限制人们只能对数据库执行的操作。如果数据应该是只读的,并且服务合同仅允许读取操作,那么我们已设置好。或者,服务可以再次通过WCF设置凭据来协商会话。
WCF可以是仅客户端,仅服务器或者客户端-服务器连接器平台。我们选择的内容将影响我们编写的代码,但它们都将独立于数据库。代码可以进行结构化,使其成为到数据库表的一对一映射,也可以更加抽象(可以选择代表完整逻辑视图的类)。
虽然"正式"的答案是使用WCF将服务推送到Silverlight,但我认为使用MySQL的任何人都可能不会使用完整的ASP.NET解决方案。我的解决方案是构建一个PHP Web服务(如Rob所建议的)以与MySQL数据库交互,并让Silverlight以RESTful方式访问它。
这是一个由三部分组成的教程的开始,该教程使用Silverlight通过PHP Web服务访问MySQL数据库:
PHP,MySQL和Silverlight:完整教程