您可以使用 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 Service 仅允许与 Web Service 托管在同一域中的 Silverlight 访问。如果 Silverlight 应用程序托管在另一个网站/域上,Web 服务将拒绝通信。因此,我们必须为托管在不同域的 Silverlight 配置 Web 服务的访问权限。
您必须创建两个附加文件:clientaccesspolicy.xml和crossdomain.xml。
这些文件必须放在托管 Web 服务的域的根目录中。
示例:http://www.mywebsite.com/clientaccesspolicy.xml
和http://www.mywebsite.com/crossdomain.xml
客户端访问策略.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>
跨域.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>
要了解有关此的更多信息,请阅读:跨域边界提供服务 (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 应用程序。
加上你的创意,相信你现在可以做的不止这些 微笑 | :)
如果您对 Web 服务进行了任何更改,也许您添加了新服务(新的 Web 方法),您必须在 Silverlight 更新服务参考以重新绑定服务。如果您将文件上传到不同的 Web 主机,您可能需要更新 Web 服务地址。
快乐编码。
阅读更多:
- 原始帖子 - 从 SilverLight 连接 MySQL 与 Web 服务 - CodeProject.com(由我编写)
- 从 Silverlight 应用程序访问 Web 服务
- 如何:使用 Visual C# .NET 编写简单的 Web 服务
- 如何:为 Silverlight 客户端构建服务