65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Web 服务从 Silverlight 连接 MySQL

starIconstarIconstarIconstarIconstarIcon

5.00/5 (5投票s)

2013年8月8日

CPOL

4分钟阅读

viewsIcon

34456

downloadIcon

641

Silverlight 使用 Web 服务访问 MySQL。

引言

本文介绍如何通过使用 Web 服务从 Silverlight 连接 MySQL。

演练

步骤 1:创建 Web 服务

步骤 2:向 Silverlight 添加服务引用


步骤 1:创建 Web 服务

  1. 添加一个新的 Silverlight 项目。
  2. 创建一个新的 Web 服务。右键单击 Web 项目 > 添加 > 新建项
  3. 选择“Web 服务”。
  4. 新的 Web 服务的初始代码。
  5. 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";
            }
        }
    }
  6. 为了让 Web 服务能够连接到 MySQL,我们需要将 MySql.Data.DLL 的引用添加到 Web 项目中,并在 Web 服务类的顶部添加 Using 语句
  7. using MySql.Data.MySqlClient; 
  8. 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 类型示例:INSERTUPDATEDELETE

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.xmlcrossdomain.xml

这些文件必须放在 Web 服务托管的域的根目录中。

例如:http://www.mywebsite.com/clientaccesspolicy.xmlhttp://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 服务地址。

祝您编码愉快。

阅读更多

© . All rights reserved.