代码之家  ›  专栏  ›  技术社区  ›  Isak Savo

如何让silverlight从MySQL获取数据

  •  1
  • Isak Savo  · 技术社区  · 17 年前

    我用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),并且 在本地运行它 .

    我希望它在服务器上运行,但我无法让它工作,总是以权限异常结束(不允许使用SocketPermission)。

    数据库与silverlight应用程序托管在同一服务器上,如果这有什么不同的话。

    编辑 好的,我现在明白了为什么在客户端应用程序中使用db凭据是一个坏主意(显然)。那么人们是怎么做到的呢?如何保护代理web服务,使其以安全的方式在客户端/db之间中继数据?网上有什么例子吗?

    当然,我不能成为第一个想使用数据库为silverlight应用程序供电的人吗?

    6 回复  |  直到 17 年前
        1
  •  4
  •   Rob    17 年前

    虽然“官方”的答案是使用WCF将服务推送到Silverlight,但我认为任何使用MySQL的人都可能不会使用完整的ASP。NET解决方案。我的解决方案是构建一个PHP Web服务(就像Rob建议的那样)来与MySQL数据库交互,并让Silverlight以RESTful方式访问它。

    以下是使用Silverlight通过PHP web服务访问MySQL数据库的三部分教程的开始:

    PHP, MySQL and Silverlight: The Complete Tutorial

        2
  •  5
  •   MatthiasS    16 年前

    做你想做的事情的最简单方法(现在已经通读了你的编辑:)将是公开可以使用的服务。微软现在真正推动的模式是公开WCF服务,但事实是,你的Silverlight客户端可以使用WCF来使用许多不同类型的服务。

    现在对你来说最简单的方法可能是使用。NET服务或PHP REST服务,然后将Silverlight应用程序指向该服务。通过这样做,您不仅可以保护您的数据库免受人们窥探,更重要的是,您可以限制人们对您的数据库所做的操作。如果你的数据应该是只读的,而你的服务合同只允许读取操作,那么你就设置好了。或者,您的服务也可以通过WCF设置凭据来协商会话。

    WCF可以是仅客户端、仅服务器或客户端-服务器连接器平台。您的选择将影响您编写的代码,但这一切都将独立于您的数据库。您的代码可以进行结构化,使其与数据库表一一对应,也可以更抽象(如果您选择,可以设置表示完整逻辑视图的类)。

        3
  •  3
  •   cruizer    17 年前

    Silverlight没有任何直接访问数据库服务器的能力。您可以通过web服务(ASMX或WCF,甚至非.NET!)公开数据库操作,并使用Silverlight访问这些服务。

        4
  •  3
  •   angularsen Bcelik    15 年前

    我刚刚开始做这件事;ASP。NET4网站,Linux Ubuntu 10/Apache2服务器上有Silverlight4内容。内容是使用Visual Studio 2010开发的。VS2008也应该运行良好。

    服务器:

    • 使用Apache2和MySQL设置Linux服务器,有很多关于这方面的指南。
      • 确保MySQL可以从开发PC访问,也可以从互联网访问。详情请参见此处: Causes of Access-Denied Errors .
      • 设置数据库表结构,并添加一些内容以供以后测试。在我们的示例中,我们假设您有一个表“persons”,其列为“name”。
    • 由于Silverlight是一种客户端技术,您可以使用简单的HTML页面来托管应用程序。
    • Silverlight和MySQL之间需要web服务。微软的WCF RIA是一种风格,但需要。网。从好的方面来说,您可以托管ASP。NET4页面同样如此。以下是设置它的详细指南: Setting up Mono 2.8 with Asp.Net 4.0 and MVC2 on Ubuntu with MySql Membership

    Visual Studio:

    • 安装最新版本 MySQL Connector/Net 并重新启动VS
    • 添加MySQL数据库作为数据源
      • 打开服务器资源管理器->添加数据连接->选择“MySQL数据库”
      • 填写凭据并测试连接

    使用MySQL访问设置站点:

    以下是我觉得有用的指南: Step By Step Guide to WCF RIA enabled SL4 application with Entity Framework

    • 创建或打开Silverlight项目。
      • 服务器端项目通常命名为“ProjectName”。Web“
      • 客户端项目通常命名为“ProjectName”
    • 添加“ADO。NET实体数据模型“”到服务器项目。这将是数据库结构的模型。
      • 选择“从数据库生成”
      • 选择您创建的MySQL数据库连接
      • 选择要访问的表
    • 在继续之前,请立即构建您的解决方案。
    • 将“域服务类”添加到服务器项目中,例如“FooDomain”。这将使数据库实体对客户端Silverlight代码可用。
      • 在“可用DataContext/ObjectContext类:”中,选择您在上一步中创建的实体框架模型。
      • 检查要访问的实体,并在适当的情况下选中“启用编辑”
      • 选中“为元数据生成关联类”
    • 基于服务器项目中的“FooDomainContext”,再次构建解决方案以生成“FooDamainContext”。

    测试:

    让我们将MySQL中的数据导入Silverlight。假设有一个名为“persons”的表,列名为“name”,我们可以绑定一个列表框来显示人员的姓名。

    首先添加一个Silverlight页面,比如“主页”。 在Home.xaml中添加:

    <ListBox x:Name="TestList" Width="100" />
    

    在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”,这将生成所使用的“FooDmainContext”类。

    希望,如果所有设置都正确,您现在可以在运行Silverlight项目时看到一个人名列表。

    编辑: ASP。NET不是可选的,但对于我的示例中使用的WCF RIA web服务来说是必需的。

        5
  •  2
  •   Kristian J.    17 年前

    从客户端直接将数据库连接到服务器通常是一个坏主意。我不知道反编译Silverlight应用程序有多容易,但我想这在某种程度上是可能的。然后,你基本上是在向用户提供你的数据库凭据。

        6
  •  1
  •   mjb    12 年前

    您可以使用Web Services从MySQL获取数据。

    演练:

    步骤1:创建Web服务

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


    步骤1:创建Web服务

    添加新的Silverlight项目。

    Add a new Silverlight project

    创建新的Web服务。右键单击web项目>添加>新项目

    Create a new Web Service

    选择“Web服务”。

    enter image description here

    新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服务能够连接到MySQL,我们需要添加MySQL的引用。数据。将DLL添加到web项目中,并在web服务类顶部添加Using语句:

    using MySql.Data.MySqlClient; 
    

    你好世界 是Visual Studio创建的初始示例方法。您可能想删除它,因为它不需要。我将创建2个简单的方法来演示如何使用Web服务在SilverLight和MySQL之间进行通信。

    第一种方法: 执行标量()

    这种方法很简单。从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;
        }
    } 
    

    第二种方法: 执行非查询()

    用于单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;
                }
            }  
        }
    } 
    

    你会注意到一个属性 [网络方法] 添加到方法中。

    重建项目,让Web服务为下一步做好准备。

    Rebuild the project

    Web服务访问权限

    请注意,默认情况下,Web服务只允许与Web服务托管在同一域中的Silverlight访问。如果Silverlight应用程序托管在另一个网站/域上,Web服务将拒绝通信。因此,我们必须配置Silverlight访问Web服务的权限,Silverlight托管在不同的域中。

    您必须创建两个附加文件: 客户端访问策略.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 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添加服务引用。

    Add a Service Reference to Silverlight

    键入Web服务的地址,然后按[Go]。

    地址示例: http://www.mywebsite.com/MyCoolWebService.asmx

    根据您的喜好更改命名空间,然后按[确定]。

    Web Service Browser

    Visual Studio将分析Web服务,进行数据绑定并创建类。

    在继续编码之前,让我们看看在新创建的类中可以使用哪些方法。在新类上单击鼠标右键,然后选择[在对象浏览器中查看]。

    View in Object Browser

    我们要使用的类是WebService1SoapClient(在本例中)。命名基于服务名称。如果我们将服务类命名为MyCoolWebService,那么在Silverlight中,MyCoolWebServiceSoapClient将被选为类的名称。在右侧面板中,突出显示了两个方法和两个事件。这些是用于调用Web服务的方法。

    Object of WebService1SoapClient

    让我们通过添加一个文本框和两个按钮来创建一个简单的Silverlight应用程序。

    在这个例子中,用户将直接在文本框中键入SQL查询。

    [ExecuteScalar]按钮将向Web服务发送SQL并检索数据。(选择、显示等)

    [ExecuteNonQuery]按钮将把SQL发送到Web服务以供执行。(插入、更新、删除等)

    Design a simple SilverLight App

    这是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)
            {
            }
        }
    }
    

    现在,我们在这里要做的是:

    • 在类级别将服务声明为静态对象: 服务参考1.WebService1SoapClient
    • 创建服务完成事件的两种方法。
    • 点击按钮时调用服务。
    • 显示服务结果:MessageBox。显示()


    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应用程序。

    Testing

    Testing

    Testing

    再加上你的创造力,我相信你现在可以做更多的事情。微笑|:)

    如果您对Web服务进行了任何更改,可能是添加了新的服务(新的Web方法),则必须更新Silverlight上的服务引用以重新绑定服务。如果您将文件上载到其他虚拟主机,则可能需要更新Web服务地址。

    update the Service Reference

    快乐编码。

    阅读更多:

    1. Original Post - Connecting MySQL From SilverLight With Web Services - CodeProject.com (written by me)
    2. Access a Web Service from a Silverlight Application
    3. HOW TO: Write a Simple Web Service by Using Visual C# .NET
    4. How to: Build a Service for Silverlight Clients
    推荐文章