如何让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)并在本地运行它,这可以正常工作 。
我希望这在服务器上运行,我无法让它工作,总是以权限exception结束(不允许SocketPermission)。
数据库与Silverlight应用程序托管在同一服务器上,如果这有任何区别的话。
编辑好的,我现在明白为什么在客户端应用程序中显示数据库凭据是一个坏主意(显然)。 人们如何做到这一点呢? 如何保护代理Web服务,以便以安全的方式将数据传入和传出客户端/数据库? 网上有没有任何例子?
当然,我不能成为第一个使用数据库为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:完整教程
Silverlight没有任何直接访问数据库服务器的function。 您可以做的是通过Web服务(ASMX或WCF,甚至非.NET!)公开您的数据库操作,并使用Silverlight访问这些服务。
我刚刚开始工作; 在Linux Ubuntu 10 / Apache2服务器上使用Silverlight4内容的ASP.NET4站点。 内容是使用Visual Studio 2010开发的.VS2008也应该可以正常工作。
服务器:
- 使用Apache2和MySQL设置Linux服务器,有很多指南。
- 确保可以从开发PC和Internet(可选)访问MySQL。 有关详细信息,请参阅此处: 访问 – 拒绝错误的原因 。
- 设置数据库表结构并添加一些内容以便稍后进行测试。 在我们的示例中,我们假设您的表’人’与列’name’。
- 由于Silverlight是一种客户端技术,因此您可以使用简单的HTML页面来托管应用程序。
- Silverlight和MySQL之间需要Web服务。 微软的WCF RIA是一种风格,但需要.NET。 在正面,你也可以托管ASP.NET4页面。 以下是设置它的全面指南: 在Ubuntu上使用MySql成员资格在Asp.Net 4.0和MVC2上设置Mono 2.8
视觉工作室:
- 安装最新的MySQL Connector / Net并重启VS.
- 将MySQL数据库添加为数据源
- 打开服务器资源管理器 – >添加数据连接 – >选择“MySQL数据库”
- 填写凭据并测试连接
使用MySQL访问权限设置站点:
以下是我发现有用的指南: WCF RIA分步指南启用了SL4应用程序和entity framework
- 创建或打开Silverlight项目。
- 服务器端项目通常名为“ProjectName.Web”
- 客户端项目通常名为“ProjectName”
- 将“ADO.NET实体数据模型”添加到服务器项目中。 这将是您的数据库结构的模型。
- 选择“从数据库生成”
- 选择您创建的MySQL数据库连接
- 选择要访问的表
- 在继续之前立即构建您的解决方案。
- 将“域服务类”添加到服务器项目,f.ex。 ‘FooDomain’。 这将使数据库实体可用于客户端Silverlight代码。
- 在’Available DataContext / ObjectContext classes:’中,选择您在上一步中创建的Entity Framework模型。
- 检查要访问的实体,并在适当的位置选中“启用编辑”
- 选中’为元数据生成关联的类’
- 再次构建解决方案以基于服务器项目中的“FooDomain”生成“FooDomainContext”。
测试:
让我们从MySQL获取数据到Silverlight。 假设有一个名为’persons’的表,列名为’name’,我们可以绑定一个列表框来显示人员的姓名。
首先添加一个Silverlight页面,让我们说’Home’。 在Home.xaml中添加:
在Home.xaml.cs文件中添加:
public partial class Home : Page { public Home() { InitializeComponent(); Loaded += Home_Loaded; } void Home_Loaded(object sender, RoutedEventArgs e) { var context = new FooDomainContext(); var query = context.Load(context.GetPersonsQuery()); TestList.ItemsSource = query.Entities; TestList.DisplayMemberPath = "name"; } }
在这里,我们假设您将域名服务命名为“FooDomain”,这将生成使用的“FooDomainContext”类。
希望如果所有设置都正确,您将在运行Silverlight项目时看到人名列表。
编辑: ASP.NET不是可选的,但在我的示例中使用的WCF RIA Web服务是必需的。
从客户端直接与服务器建立DB连接通常是个坏主意。 我不知道反编译Silverlight应用程序有多容易,但我猜它有可能在某种程度上。 然后,您基本上将您的数据库凭据泄露给您的用户。
您可以使用Web服务从MySQL获取数据。
演练:
第1步:创建Web服务
第2步:向Silverlight添加服务引用
第1步:创建Web服务
添加一个新的Silverlight项目。
创建一个新的Web服务。 右键单击Web项目>添加>新项
选择“Web服务”。
新Web服务的初始代码。
using System; using System.Collections.Generic; using System.Web; using System.Web.Services; namespace SilverlightApplication1.Web { /// /// Summary description for WebService1 /// [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] public class WebService1 : System.Web.Services.WebService { [WebMethod] public string HelloWorld() { return "Hello World"; } } }
为了使Web服务能够连接到MySQL,我们需要将MySql.Data.DLL的引用添加到Web项目中,并在Web Service类的顶部添加Using语句:
using MySql.Data.MySqlClient;
HelloWorld()是Visual Studio创建的初始示例方法。 您可能希望删除它,因为它不需要。 我将创建两个简单的方法来演示如何使用Web服务在SilverLight和MySQL之间进行通信。
第一种方法: ExecuteScalar()
这种方法很简单。 从MySQL获取单个对象。
public string ExecuteScalar(string sql) { try { string result = ""; using (MySqlConnection conn = new MySqlConnection(constr)) { using (MySqlCommand cmd = new MySqlCommand()) { conn.Open(); cmd.Connection = conn; cmd.CommandText = sql; result = cmd.ExecuteScalar() + ""; conn.Close(); } } return result; } catch (Exception ex) { return ex.Message; } }
第二种方法: ExecuteNonQuery()
对于单个SQL执行。 SQL类型示例:INSERT,UPDATE,DELETE。
public string ExecuteNonQuery(string sql) { try { long i = 0; using (MySqlConnection conn = new MySqlConnection(constr)) { using (MySqlCommand cmd = new MySqlCommand()) { conn.Open(); cmd.Connection = conn; cmd.CommandText = sql; i = cmd.ExecuteNonQuery(); conn.Close(); } } return i + " row(s) affected by the last command, no resultset returned."; } catch (Exception ex) { return ex.Message; } }
这是添加上述两种方法后Web服务的样子:
using System; using System.Collections.Generic; using System.Web; using System.Web.Services; using MySql.Data.MySqlClient; namespace SilverlightApplication1.Web { [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] public class WebService1 : System.Web.Services.WebService { string constr = "server=localhost;user=root;pwd=1234;database=test;"; [WebMethod] public string ExecuteScalar(string sql) { try { string result = ""; using (MySqlConnection conn = new MySqlConnection(constr)) { using (MySqlCommand cmd = new MySqlCommand()) { conn.Open(); cmd.Connection = conn; cmd.CommandText = sql; result = cmd.ExecuteScalar() + ""; conn.Close(); } } return result; } catch (Exception ex) { return ex.Message; } } [WebMethod] public string ExecuteNonQuery(string sql) { try { long i = 0; using (MySqlConnection conn = new MySqlConnection(constr)) { using (MySqlCommand cmd = new MySqlCommand()) { conn.Open(); cmd.Connection = conn; cmd.CommandText = sql; i = cmd.ExecuteNonQuery(); conn.Close(); } } return i + " row(s) affected by the last command, no resultset returned."; } catch (Exception ex) { return ex.Message; } } } }
您会注意到[WebMethod]的属性已添加到方法中。
重建项目并让Web Service为下一步做好准备。
Web服务访问权限
请注意,默认情况下,Web Service仅允许与Web Service在同一域中托管的Silverlight访问。 如果Silverlight应用程序托管在其他网站/域上,则Web Service将拒绝通信。 因此,我们必须配置由Silverlight访问的Web Service的权限,Silverlight托管在不同的域中。
您必须创建另外两个文件: clientaccesspolicy.xml和crossdomain.xml 。
这些文件必须放在托管Web服务的域的根目录中。
示例: http://www.mywebsite.com/clientaccesspolicy.xml
: http://www.mywebsite.com/clientaccesspolicy.xml
和http://www.mywebsite.com/crossdomain.xml
clientaccesspolicy.xml
如果您只想允许特定域访问Web Service(例如:www.myanotherwebsite.com),则可以在其中添加。 例:
crossdomain.xml的
要了解更多相关信息,请阅读: 跨域边界提供服务(MSDN)
第2步:向Silverlight添加服务引用
向Silverlight添加服务引用。
键入Web服务的地址,然后按[开始]。
地址示例: http : //www.mywebsite.com/MyCoolWebService.asmx
更改命名空间,然后按[确定]。
Visual Studio将分析Web服务,执行数据绑定并创建类。
在继续编码之前,让我们看看我们可以在新创建的类中使用哪些方法。 右键单击新类,然后选择[在对象浏览器中查看]。
我们要使用的类是WebService1SoapClient(在本例中)。 命名基于服务名称。 如果我们将服务类命名为MyCoolWebService,那么将选择MyCoolWebServiceSoapClient作为Silverlight中类的名称。 在右侧面板中,突出显示了两个方法和两个事件。 这些是用于调用Web服务的方法。
让我们通过添加一个Textbox和两个Buttons来创建一个简单的Silverlight应用程序。
在此示例中,用户将SQL查询直接键入文本框。
[ExecuteScalar]按钮将SQL发送到Web服务并检索数据。 (选择,显示等)
[ExecuteNonQuery]按钮将SQL发送到Web服务仅供执行。 (插入,更新,删除等)
这是MainPage.xaml背后的初始代码:
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; namespace SilverlightApplication1 { public partial class MainPage : UserControl { public MainPage() { InitializeComponent(); } private void btExecuteScalar_Click(object sender, RoutedEventArgs e) { } private void btExecuteNonQuery_Click(object sender, RoutedEventArgs e) { } } }
现在,这些是我们将要做的:
- 在类级别将服务声明为静态对象:ServiceReference1.WebService1SoapClient
- 创建两种方法的服务已完成事件。
- 单击按钮时调用服务。
- 显示服务结果:MessageBox.Show()
public partial class MainPage : UserControl { ServiceReference1.WebService1SoapClient myService; public MainPage() { InitializeComponent(); myService = new ServiceReference1.WebService1SoapClient(); myService.ExecuteScalarCompleted += myService_ExecuteScalarCompleted; myService.ExecuteNonQueryCompleted += myService_ExecuteNonQueryCompleted; } void myService_ExecuteNonQueryCompleted(object sender, ServiceReference1.ExecuteNonQueryCompletedEventArgs e) { MessageBox.Show(e.Result); } void myService_ExecuteScalarCompleted(object sender, ServiceReference1.ExecuteScalarCompletedEventArgs e) { MessageBox.Show(e.Result); } private void btExecuteScalar_Click(object sender, RoutedEventArgs e) { myService.ExecuteScalarAsync(textBox1.Text); } private void btExecuteNonQuery_Click(object sender, RoutedEventArgs e) { myService.ExecuteNonQueryAsync(textBox1.Text); } }
按[F5],运行并测试Silverlight应用程序。
再加上你的创造力,我相信你现在可以做更多的事情,现在微笑| 🙂
如果您对Web Service进行了任何更改,可能添加了新的Service(新Web方法),则必须更新Silverlight上的Service Reference以重新绑定服务。 如果您将文件上载到其他Web托管,则可能需要更新Web服务地址。
快乐的编码。
阅读更多:
- 原始post – 从SilverLight与Web服务连接MySQL – CodeProject.com(由我编写)
- 从Silverlight应用程序访问Web服务
- HOW TO:使用Visual C#.NET编写一个简单的Web服务
- 如何:为Silverlight客户端构建服务