Как заставить silverlight получать свои данные из MySQL - PullRequest
1 голос
/ 19 сентября 2008

Я написал небольшое приложение для тестирования Hello World в Silverlight, которое я хочу разместить на сервере 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, если это имеет какое-либо значение.

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

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

Ответы [ 6 ]

5 голосов
/ 01 июня 2010

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

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

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

4 голосов
/ 04 ноября 2008

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

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

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

3 голосов
/ 28 марта 2011

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

Сервер:

  • Установите сервер Linux с Apache2 и MySQL, на это есть множество руководств.
    • Убедитесь, что MySQL доступен с ПК разработчика и, возможно, из Интернета. Подробности см. Здесь: Причины ошибок в доступе .
    • Настройте структуры таблиц базы данных и добавьте некоторый контент для тестирования позже. В нашем примере мы предполагаем, что у вас есть таблица «people» со столбцом «name».
  • Поскольку Silverlight является технологией на стороне клиента, вы достаточно хороши и можете разместить приложение на простой HTML-странице.
  • Требуется веб-служба между Silverlight и MySQL. WCF RIA от Microsoft - один из вариантов, но требует .NET. С другой стороны, вы также можете размещать страницы ASP.NET4. Вот подробное руководство по настройке: Настройка Mono 2.8 с Asp.Net 4.0 и MVC2 в Ubuntu с членством MySql

Visual Studio:

  • Установите последнюю версию MySQL Connector / Net и перезапустите VS
  • Добавьте базу данных MySQL в качестве источника данных.
    • Открыть обозреватель серверов -> Добавить подключение к данным -> Выбрать «База данных MySQL»
    • Заполните учетные данные и проверьте соединение

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

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

  • Создайте или откройте проект Silverlight.
    • Проект на стороне сервера обычно называется 'ProjectName.Web'
    • Проект на стороне клиента обычно называется 'ProjectName'
  • Добавить 'ADO.NET Entity Data Model' в проект сервера. Это будет модель вашей структуры базы данных.
    • Выберите «Создать из базы данных»
    • Выберите соединение с базой данных MySQL, которое вы создали
    • Выберите таблицы, к которым вы хотите получить доступ
  • Создайте свое решение сейчас, прежде чем продолжить.
  • Добавить «Класс обслуживания домена» в проект сервера, например. 'FooDomain. Это сделает объекты базы данных доступными для клиентского кода Silverlight.
    • В «Доступных классах DataContext / ObjectContext:» выберите модель Entity Framework, созданную на предыдущем шаге.
    • Отметьте объекты, к которым вы хотите получить доступ, и отметьте «Включить редактирование», где это необходимо.
    • Установите флажок «Создать связанные классы для метаданных»
  • Снова создайте свое решение, чтобы сгенерировать 'FooDomainContext' на основе 'FooDomain' в проекте сервера.

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

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

Сначала добавьте страницу 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', и это сгенерирует используемый класс 'FooDomainContext'.

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

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

3 голосов
/ 19 сентября 2008

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

2 голосов
/ 19 сентября 2008

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

1 голос
/ 29 декабря 2013

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

Пошаговое руководство:

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

Шаг 2. Добавление служебной ссылки в Silverlight

<ч /> Шаг 1. Создание веб-служб

Добавление нового проекта Silverlight.

Add a new Silverlight project

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

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

Разрешение доступа к веб-службе

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

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

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

Пример: <a href="http://www.mywebsite.com/clientaccesspolicy.xml" rel="nofollow noreferrer">http://www.mywebsite.com/clientaccesspolicy.xml</a> и <a href="http://www.mywebsite.com/crossdomain.xml" rel="nofollow noreferrer">http://www.mywebsite.com/crossdomain.xml</a>

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

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

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

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

  • Объявите службу как статический объект на уровне класса: 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.

Testing

Testing

Testing

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

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

update the Service Reference

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

Подробнее:

  1. Оригинальный пост - Соединение MySQL с SilverLight с веб-сервисами - CodeProject.com (написано мной)
  2. Доступ к веб-службе из приложения Silverlight
  3. КАК: Написать простой веб-сервис с использованием Visual C # .NET
  4. Как: создать сервис для клиентов Silverlight
...