使用 Web 服务从 Silverlight 连接 MySQL
Silverlight 使用 Web 服务访问 MySQL。
引言
本文介绍如何通过使用 Web 服务从 Silverlight 连接 MySQL。
演练
步骤 1:创建 Web 服务
步骤 2:向 Silverlight 添加服务引用
步骤 1:创建 Web 服务
- 添加一个新的 Silverlight 项目。
- 创建一个新的 Web 服务。右键单击 Web 项目 > 添加 > 新建项
- 选择“Web 服务”。
- 新的 Web 服务的初始代码。
- 为了让 Web 服务能够连接到 MySQL,我们需要将 MySql.Data.DLL 的引用添加到 Web 项目中,并在 Web 服务类的顶部添加
Using
语句 HelloWorld()
是 Visual Studio 创建的初始示例方法。您可以根据需要删除它。我将创建 2 个简单的方法来演示如何使用 Web 服务在 Silverlight 和 MySQL 之间进行通信。
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";
}
}
}
using MySql.Data.MySqlClient;
第一个方法: 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 服务为下一步做好准备。
Web 服务访问权限
请注意,默认情况下,Web 服务只允许与 Web 服务位于同一域的 Silverlight 进行访问。如果 Silverlight 应用程序托管在另一个网站/域上,Web 服务将拒绝通信。因此,我们必须配置 Web 服务的权限,以便托管在不同域的 Silverlight 可以访问它。
您必须创建两个附加文件:clientaccesspolicy.xml 和 crossdomain.xml。
这些文件必须放在 Web 服务托管的域的根目录中。
例如:http://www.mywebsite.com/clientaccesspolicy.xml 和 http://www.mywebsite.com/crossdomain.xml
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>
如果您只想允许特定域(例如:www.myanotherwebsite.com)访问 Web 服务,则可以将其添加到 <allow-from> 中。例子
<?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>
要了解更多关于此的信息,请阅读: 跨域边界提供服务 (MSDN)
步骤 2:向 Silverlight 添加服务引用
向 Silverlight 添加服务引用。
输入 Web 服务的地址,然后按 [Go]。
地址示例:http://www.mywebsite.com/MyCoolWebService.asmx
将命名空间更改为您喜欢的名称,然后按 [OK]。
Visual Studio 将分析 Web 服务,进行数据绑定并创建一个类。
在继续编码之前,让我们看看可以在新创建的类中使用哪些方法。右键单击新类,然后选择 [在对象浏览器中查看]。
我们将要使用的类是 WebService1SoapClient
(在本例中)。命名基于服务名称。如果我们把服务类命名为 MyCoolWebService
,那么 MyCoolWebServiceSoapClient
将被选为 Silverlight 中的类名。在右侧面板中,两个方法和两个事件被突出显示。这些是用于调用 Web 服务的方法。
让我们通过添加一个 Textbox 和两个 Buttons 来创建一个简单的 Silverlight 应用程序。
在此示例中,用户将直接在 Textbox 中输入 SQL 查询。
[ExecuteScalar] 按钮会将 SQL 发送到 Web 服务并检索数据。(SELECT, SHOW, 等)
[ExecuteNonQuery] 按钮会将 SQL 发送到 Web 服务仅用于执行。(INSERT, UPDATE, DELETE, 等)
这是 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 服务地址。
祝您编码愉快。