您可以使用 Web 服务从 MySQL 获取数据。
演练:
第 1 步:创建 Web 服务
第 2 步:向 Silverlight 添加服务引用
第 1 步:创建 Web 服务
添加一个新的 Silverlight 项目。
创建一个新的 Web 服务。右键单击 web 项目 > 添加 > 新建项目
选择“网络服务”。
新 Web 服务的初始代码。
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Services;
namespace SilverlightApplication1.Web
{
/// <summary>
/// Summary description for WebService1
/// </summary>
[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 Service 能够连接 MySQL,我们需要在 Web 项目中添加对 MySql.Data.DLL 的引用,并在 Web Service 类的顶部添加 Using 语句:
using MySql.Data.MySqlClient;
HelloWorld() 是 Visual Studio 创建的初始示例方法。您可能需要删除它,因为它不需要。我将创建 2 个简单的方法来演示如何使用 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 Service的样子:
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 服务为下一步做好准备。
Web 服务访问权限
请注意,默认情况下,Web Service 仅允许与 Web Service 托管在同一域中的 Silverlight 访问。如果 Silverlight 应用程序托管在另一个网站/域上,Web 服务将拒绝通信。因此,我们必须为托管在不同域的 Silverlight 配置 Web 服务的访问权限。
您必须创建两个附加文件:clientaccesspolicy.xml 和 crossdomain.xml。
这些文件必须放在托管 Web 服务的域的根目录中。
示例:@987654321@ 和 @987654322@
clientaccesspolicy.xml
<?xml version="1.0" encoding="utf-8"?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="SOAPAction">
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
如果您只想允许特定域访问 Web 服务(例如:www.myanotherwebsite.com),您可以将其添加到 .示例:
<?xml version="1.0" encoding="utf-8"?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="SOAPAction">
<domain uri="http://www.myanotherwebsite.com"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
crossdomain.xml
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE cross-domain-policy SYSTEM
"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-http-request-headers-from domain="*" headers="SOAPAction,Content-Type"/>
</cross-domain-policy>
要了解更多信息,请阅读:Making a Service Available Across Domain Boundaries (MSDN)
第 2 步:向 Silverlight 添加服务引用
添加对 Silverlight 的服务引用。
键入 Web 服务的地址并按 [Go]。
地址示例:http://www.mywebsite.com/MyCoolWebService.asmx
根据您的喜好更改命名空间,然后按 [OK]。
Visual Studio 将分析 Web 服务,进行数据绑定并创建一个类。
在继续编码之前,让我们看看我们可以在新创建的类中使用哪些方法。右键单击新类并选择[在对象浏览器中查看]。
我们将要使用的类是 WebService1SoapClient(在本例中)。命名基于服务名称。如果我们将我们的服务类命名为 MyCoolWebService,那么 MyCoolWebServiceSoapClient 将被选为 Silverlight 中类的名称。在右侧面板中,突出显示了两个方法和两个事件。这些是用于调用 Web 服务的方法。
让我们通过添加一个文本框和两个按钮来创建一个简单的 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 应用程序。
加上你的创造力,我相信你现在可以做更多的事情 Smile | :)
如果您对 Web 服务进行了任何更改,也许您添加了新服务(新的 Web 方法),您必须在 Silverlight 更新服务参考以重新绑定服务。如果您将文件上传到不同的虚拟主机,您可能需要更新网络服务地址。
编码愉快。
阅读更多:
-
Original Post - Connecting MySQL From SilverLight With Web Services - CodeProject.com (written by me)
-
Access a Web Service from a Silverlight Application
-
HOW TO: Write a Simple Web Service by Using Visual C# .NET
- How to: Build a Service for Silverlight Clients