Как заставить silverlight получать свои данные из MySQL

Я написал небольшое приложение для тестирования Hello World в Silverlight, которое я хочу разместить на сервере Linux / Apache2. Я хочу, чтобы данные поступали из MySQL (или другой совместимой с Linux базы данных), чтобы я мог связываться с данными в базе данных.

Мне удалось заставить его работать с помощьюMySQL, Connector / .NET:

<code>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();
}
</code>

Это прекрасно работает, если я полностью доверяю опубликованному приложению ClickOnce (или, по крайней мере, SocketPermission) иrun it locally.

Я хочу, чтобы это выполнялось на сервере, и я не могу заставить его работать, всегда заканчивая исключением разрешения (SocketPermission не разрешен).

База данных размещается на том же сервере, что и приложение Silverlight, если это имеет значение.

EDIT Хорошо, теперь я понимаю, почему плохая идея иметь учетные данные БД в клиентском приложении (очевидно). Как люди делают это тогда? Как вы защищаете прокси-веб-службу, чтобы она передавала данные клиенту / базе данных безопасным способом? Есть ли примеры в интернете?

Конечно, я не могу быть первым человеком, который хотел бы использовать базу данных для питания приложения Silverlight?

Ответы на вопрос(6)

Вы можете получить данные из MySQL с помощью веб-сервисов.

Прохождение:

Шаг 1. Создание веб-сервисов

Шаг 2: Добавьте сервисную ссылку в Silverlight

Step 1: Create Web Services

Добавить новый проект Silverlight, t.

Add a new Silverlight project

Создайте новый веб-сервис. Щелкните правой кнопкой мыши веб-проект & gt; Добавить & gt; Новый предмет

Create a new Web Service

Выберите «Веб-служба».

enter image description here

Исходный код нового веб-сервиса.

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";
        }
    }
}

Чтобы веб-служба могла подключаться к MySQL, нам нужно добавить ссылку на MySql.Data.DLL в веб-проект и добавить оператор Using в верхней части класса веб-службы:

using MySql.Data.MySqlClient; 

HelloWorld() является исходным методом, созданным Visual Studio. Вы можете удалить его, так как он не нужен. Я собираюсь создать 2 простых метода, чтобы продемонстрировать, как веб-сервисы используются для связи между 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;
    }
}  

Вот так выглядит веб-служба после добавления двух методов выше:

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] добавлен в методы.

Перестройте проект и дайте веб-службе быть готовой к следующему шагу.

Rebuild the project

Web Service Access Permission

Обратите внимание, что по умолчанию веб-служба разрешает доступ только тем Silverlight, которые размещены в одном домене с веб-службой. Если приложение Silverlight размещено на другом веб-сайте / домене, веб-служба будет отказывать в связи. Поэтому нам необходимо настроить разрешение для доступа к веб-службе Silverlight, размещенной в другом домене.

Вы должны создать два дополнительных файла:clientaccesspolicy.xml а такжеcrossdomain.xml.

Эти файлы должны быть помещены в корень домена, где размещены веб-службы.

Пример: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), вы можете добавить его в. Пример:

<?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)

Step 2: Add Service Reference to Silverlight

Добавьте сервисную ссылку в Silverlight.

Add a Service Reference to Silverlight

Введите адрес веб-службы и нажмите [Go].

Пример адреса:http://www.mywebsite.com/MyCoolWebService.asmx

Измените Пространство имен в свою пользу и нажмите [OK].

Web Service Browser

Visual Studio проанализирует веб-сервис, сделает привязку данных и создаст класс.

Прежде чем продолжить кодирование, давайте посмотрим, какие методы мы можем использовать в новом созданном классе. Щелкните правой кнопкой мыши новый класс и выберите [View in Object Browser].

View in Object Browser

Класс, который мы собираемся использовать, - это WebService1SoapClient (в этом примере). Наименование основывается на имени службы. Если мы назовем наш класс обслуживания MyCoolWebService, то MyCoolWebServiceSoapClient будет выбран в качестве имени класса в Silverlight. На правой панели выделены два метода и два события. Это методы, используемые для вызова веб-сервисов.

Object of WebService1SoapClient

Давайте создадим простое приложение Silverlight, добавив текстовое поле и две кнопки.

В этом примере пользователь вводит SQL-запрос непосредственно в текстовое поле.

Кнопка [ExecuteScalar] отправит SQL-запрос в веб-службу и получит данные обратно. (ВЫБРАТЬ, ПОКАЗАТЬ и т. Д.)

Кнопка [ExecuteNonQuery] отправит SQL-запрос в веб-службу только для выполнения. (ВСТАВИТЬ, ОБНОВИТЬ, УДАЛИТЬ и т. Д.)

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

Вот что мы собираемся сделать здесь:

Declare the service as static object at class level: ServiceReference1.WebService1SoapClient Create the service completed event of the two methods. Call the service in the event of button click. Display the service result: 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.

Testing

Testing

Testing

Я верю, что вместе с вашим творчеством вы можете сделать что-то большее, чем это сейчас Smile | :)

Если вы внесли какие-либо изменения в веб-службу, возможно, вы добавили новую службу (новые веб-методы), вам необходимо обновить ссылку на службу в Silverlight, чтобы заново привязать службы. Возможно, вы захотите обновить адрес веб-службы, если вы загрузили файлы на другой веб-хостинг.

update the Service Reference

Удачного кодирования.

Прочитайте больше:

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

Я только что получил это работает; Сайт ASP.NET4 с содержимым Silverlight4 на сервере Linux Ubuntu 10 / Apache2. Контент разработан с использованием Visual Studio 2010. VS2008 также должен работать нормально.

Сервер:

Setup a Linux server with Apache2 and MySQL, there are tons of guides on this. Make sure MySQL is accessible from the development PC and optionally from the Internet. See here for details: Causes of Access-Denied Errors. Setup the database table structures and add some content for testing later. In our example we assume you have the table 'persons' with the column 'name'. Since Silverlight is a client-side technology you are pretty much good-to-go and can host the application with a simple HTML page. A web service is required between Silverlight and MySQL. Microsoft's WCF RIA is one flavor, but requires .NET. On the plus-side, you get to host ASP.NET4 pages as well. Here is a thorough guide to setting it up: Setting up Mono 2.8 with Asp.Net 4.0 and MVC2 on Ubuntu with MySql Membership

Visual Studio:

Install latest MySQL Connector/Net and restart VS Add your MySQL database as data source Open Server Explorer -> Add data connection -> Select 'MySQL Database' Fill in credentials and test connection

Настройка сайта с доступом к MySQL:

Вот руководство, которое я нашел полезным:Пошаговое руководство по приложению WCF с поддержкой RIA SL4 с Entity Framework

Create or open a Silverlight project. The server-side project is typically named 'ProjectName.Web' The client-side project is typically named 'ProjectName' Add 'ADO.NET Entity Data Model' to the server project. This will be a model of your database structure. Select 'Generate from database' Choose the MySQL database connection you created Select the tables you want to access Build your solution now before proceeding. Add 'Domain Service Class' to the server project, f.ex. 'FooDomain'. This will make the database entities available to the client-side Silverlight code. In 'Available DataContext/ObjectContext classes:' select the Entity Framework model you created in the previous step. Check the entities you want to access and check 'Enable editing' where appropriate Check 'Generate associated classes for metadata' Build your solution again to generate 'FooDomainContext', based on 'FooDomain' in server project.

Тестирование:

Давайте получим данные из MySQL в Silverlight. Предполагая, что есть таблица с именем «лица» с именем столбца «имя», мы можем связать список, чтобы показать имена людей.

Сначала добавьте страницу Silverlight, скажем, «Home». В 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», и это сгенерирует «FooDomainContext». класс используется.

Надеемся, что если все настроено правильно, вы увидите список имен людей при запуске проекта Silverlight.

Edit: ASP.NET не является обязательным, но требуется для веб-службы WCF RIA, используемой в моем примере.

Наличие соединений с БД напрямую к серверу со стороны клиента обычно является плохой идеей. Я не знаю, как легко декомпилировать приложение Silverlight, но я бы предположил, что это возможно каким-то образом. Затем вы в основном отдаете свои учетные данные БД своим пользователям.

В то время как & quot; официальный & quot; Ответ заключается в использовании WCF для передачи службы в Silverlight. Я полагаю, что любой, кто использует MySQL, вероятно, не будет использовать полное решение ASP.NET. Мое решение состояло в том, чтобы создать веб-сервис PHP (как предложил Роб) для взаимодействия с базой данных MySQL и иметь доступ к ней Silverlight RESTful способом.

Вот начало учебника из трех частей по использованию Silverlight для доступа к базе данных MySQL через веб-сервис PHP:

PHP, MySQL и Silverlight: полное руководство

Silverlight не имеет возможности прямого доступа к серверам баз данных. Что вы можете сделать, так это представить свои операции с базой данных через веб-сервисы (ASMX или WCF, даже не-.NET!) И использовать Silverlight для доступа к этим сервисам.

 Isak Savo19 сент. 2008 г., 09:53
Но я могу поговорить с БД, мне просто не разрешено. Почему разрешается общаться с веб-службой (по http, я полагаю?), А не с базой данных?
Решение Вопроса

Самый простой способ сделать то, что вы хотите (прочитав ваши правки сейчас :)), - это открыть сервисы, которые можно использовать. Модель, которую ДЕЙСТВИТЕЛЬНО продвигает Microsoft прямо сейчас, заключается в предоставлении служб WCF, но на самом деле ваш клиент Silverlight может использовать WCF для использования множества различных типов служб.

Для вас сейчас может быть проще всего использовать службу .NET на веб-сервере или, возможно, службу PHP REST, а затем направить свое приложение Silverlight на эту службу. Тем самым вы защищаете свою базу данных не только от людей, просматривающих ее, но и, что более важно, вы ограничиваете то, что люди могут делать с вашей базой данных. Если ваши данные должны быть доступны только для чтения, а контракт на обслуживание разрешает только операции чтения, вы переустанавливаетесь. В качестве альтернативы, ваша служба может согласовывать сеансы с учетными данными, опять же, настроенными через WCF.

WCF может быть платформой соединителя только для клиента, только для сервера или клиент-сервер. То, что вы выберете, повлияет на код, который вы пишете, но все это будет зависеть от вашей базы данных. Ваш код может быть структурирован таким образом, чтобы он отображался один на один в вашей таблице базы данных, или он может быть гораздо более абстрактным (вы можете настроить классы, которые представляют полные логические представления, если вы выберете).

Ваш ответ на вопрос