Вопрос

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

Мне удалось заставить его работать, используя Коннектор MySQL/.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, если это имеет значение.

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

Сервер:

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

Визуальная студия:

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

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

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

  • Создайте или откройте проект Silverlight.
    • Серверный проект обычно называется ProjectName.Web.
    • Клиентский проект обычно называется ProjectName.
  • Добавьте «Модель данных объекта ADO.NET» в серверный проект.Это будет модель структуры вашей базы данных.
    • Выберите «Создать из базы данных».
    • Выберите созданное вами соединение с базой данных MySQL.
    • Выберите таблицы, к которым вы хотите получить доступ
  • Прежде чем продолжить, создайте свое решение сейчас.
  • Добавьте «Класс обслуживания домена» в серверный проект, например.«Фодомен».Это сделает объекты базы данных доступными для кода 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 не является обязательным, но необходим для веб-службы WCF RIA, используемой в моем примере.

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

Вы можете получить данные из 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; 

Привет, мир() — это первоначальный образец метода, созданный Visual Studio.Возможно, вы захотите удалить его, так как он не нужен.Я собираюсь создать два простых метода, чтобы продемонстрировать, как веб-службы используются для взаимодействия между 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:ВСТАВИТЬ, ОБНОВИТЬ, УДАЛИТЬ.

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

Вы заметите, что атрибут [Веб-метод] добавляется в методы.

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

Rebuild the project

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

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

Вам необходимо создать два дополнительных файла: clientaccesspolicy.xml и кроссдомен.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>

кроссдомен.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

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

Web Service Browser

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

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

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.Показать()


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

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

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

update the Service Reference

Приятного кодирования.

Читать далее:

  1. Исходное сообщение — Подключение MySQL из SilverLight к веб-службам — CodeProject.com (написано мной)
  2. Доступ к веб-службе из приложения Silverlight
  3. КАК:Напишите простую веб-службу с помощью Visual C# .NET
  4. Как:Создание службы для клиентов Silverlight
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top