19 wrz 2008, 08:48 z Isak Savo

Jak uzyskać Silverlight, aby uzyskać dane z MySQL

Napisałem małą aplikację testową hello world w Silverlight, którą chcę hostować na serwerze Linux / Apache2. Chcę, aby dane pochodziły z MySQL (lub innej bazy danych zgodnej z Linuksem), dzięki czemu mogę tworzyć bazy danych w db.

Udało mi się go uruchomić za pomocą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>

Działa to dobrze, jeśli podam opublikowanej aplikacji ClickOnce pełne zaufanie (lub przynajmniej SocketPermission) iuruchom go lokalnie.

Chcę, aby to działało na serwerze i nie mogę go uruchomić, zawsze kończąc na wyjątku uprawnień (SocketPermission nie jest dozwolone).

Baza danych jest obsługiwana na tym samym serwerze, co aplikacja silverlight, jeśli to robi różnicę.

EDYTOWAĆ Ok, rozumiem teraz, dlaczego złym pomysłem jest posiadanie poświadczeń db w aplikacji klienta (oczywiście). Jak ludzie to robią? Jak zabezpieczyć usługę WWW proxy, aby w bezpieczny sposób przekazywać dane do iz klienta / db? Czy są jakieś przykłady w internecie?

Z pewnością nie mogę być pierwszą osobą, która chciałaby korzystać z bazy danych do zasilania aplikacji silverlight?

questionAnswers (0)

19 wrz 2008, 08:09 z Kristian J.

zazwyczaj złym pomysłem. Nie wiem, jak łatwo jest dekompilować aplikację Silverlight, ale zgaduję, że jest to możliwe. Następnie przekazujesz użytkownikom swoje poświadczenia DB.

19 wrz 2008, 07:38 z cruizer

Silverlight nie ma możliwości bezpośredniego dostępu do serwerów bazy danych. To, co możesz zrobić, to udostępnić operacje bazy danych za pośrednictwem usług internetowych (ASMX lub WCF, nawet bez.NET!) I korzystać z Silverlight, aby uzyskać dostęp do tych usług.

01 cze 2010, 14:33 z MatthiasS

do Silverlight, to w pewnym sensie stwierdzam, że każdy, kto używa MySQL, prawdopodobnie nie używałby kompletnego rozwiązania ASP.NET. Moje rozwiązanie polegało na zbudowaniu usługi PHP (jak sugerował Rob), aby współpracować z bazą danych MySQL i mieć dostęp do Silverlight w sposób RESTful.

Oto początek trzyczęściowego samouczka dotyczącego korzystania z Silverlight w celu uzyskania dostępu do bazy danych MySQL za pośrednictwem usługi internetowej PHP:

PHP, MySQL i Silverlight: kompletny samouczek

04 lis 2008, 18:26 z Rob

Najprostszym sposobem zrobienia tego, co chcesz (po przeczytaniu zmian teraz :)), będzie udostępnienie usług, które mogą zostać wykorzystane. Wzorzec, który Microsoft NAPRAWDĘ naciska teraz, to ujawnienie usług WCF, ale prawda jest taka, że ​​klient Silverlight może użyć WCF do konsumowania wielu różnych rodzajów usług.

Najprościej byłoby teraz skorzystać z usługi .NET na serwerze WWW lub usługi REST PHP, a następnie wskazać aplikację Silverlight w tej usłudze. W ten sposób chronisz swoją bazę danych nie tylko przed ludźmi, którzy ją przeglądają, ale co ważniejsze, ograniczasz to, co ludzie mogą zrobić do twojej bazy danych. Jeśli twoje dane mają być tylko do odczytu, a umowa Twojej usługi zezwala tylko na operacje odczytu, jesteś ustawiony. Alternatywnie, twoja usługa może negocjować sesje z poświadczeniami, ponownie, skonfigurowanymi przez WCF.

WCF może być platformą łączącą tylko dla klienta, tylko serwerową lub klient-serwer. To, co wybierzesz, wpłynie na kod, który piszesz, ale to wszystko będzie niezależne od twojej bazy danych. Twój kod może być skonstruowany w taki sposób, że jest mapowaniem jeden-do-jednego do tabeli bazy danych lub może być o wiele bardziej abstrakcyjny (możesz ustawić klasy reprezentujące pełne widoki logiczne, jeśli tak zdecydujesz).

28 mar 2011, 18:07 z 5,615

Właśnie to działa; Witryna ASP.NET4 z zawartością Silverlight4 na serwerze Linux Ubuntu 10 / Apache2. Treść jest rozwijana przy użyciu programu Visual Studio 2010. VS2008 również powinien działać poprawnie.

Serwer:

Skonfiguruj serwer Linux z Apache2 i MySQL, jest mnóstwo przewodników na ten temat.Upewnij się, że MySQL jest dostępny z komputera programistycznego i opcjonalnie z Internetu. Zobacz tutaj po szczegóły:Przyczyny błędów odmowy dostępu.Skonfiguruj struktury tabeli bazy danych i dodaj trochę treści do testowania później. W naszym przykładzie zakładamy, że masz tabelę „osoby” z kolumną „imię”.Ponieważ Silverlight jest technologią po stronie klienta, jesteś na tyle dobry, że możesz go obsługiwać za pomocą prostej strony HTML.Wymagana jest usługa sieciowa między Silverlight a MySQL. Microsoft WCF RIA ma jeden smak, ale wymaga .NET. Po stronie plusów możesz także obsługiwać strony ASP.NET4. Oto dokładny przewodnik, jak go skonfigurować:Konfiguracja Mono 2.8 z Asp.Net 4.0 i MVC2 w Ubuntu z członkostwem MySql

Visual Studio:

Zainstaluj najnowszą wersjęMySQL Connector / Net i uruchom ponownie VSDodaj swoją bazę danych MySQL jako źródło danychOtwórz Server Explorer -> Dodaj połączenie danych -> Wybierz „MySQL Database”Wypełnij dane uwierzytelniające i połączenie testowe

Konfigurowanie witryny z dostępem do MySQL:

Oto przewodnik, który uznałem za pomocny:Krok po kroku do WCF RIA z włączoną aplikacją SL4 z Entity Framework

Utwórz lub otwórz projekt Silverlight.Projekt po stronie serwera zazwyczaj nazywa się „ProjectName.Web”Projekt po stronie klienta zazwyczaj ma nazwę „ProjectName”Dodaj „ADO.NET Entity Data Model” do projektu serwera. Będzie to model twojej struktury bazy danych.Wybierz opcję „Generuj z bazy danych”Wybierz utworzone połączenie z bazą danych MySQLWybierz tabele, do których chcesz uzyskać dostępZbuduj swoje rozwiązanie teraz, zanim przejdziesz dalej.Dodaj „klasę usługi domeny” do projektu serwera, np. „FooDomain”. Spowoduje to, że jednostki bazy danych będą dostępne dla kodu Silverlight po stronie klienta.W „Dostępne klasy DataContext / ObjectContext:” wybierz model Entity Framework utworzony w poprzednim kroku.Sprawdź elementy, do których chcesz uzyskać dostęp, i zaznacz opcję „Włącz edycję”, jeśli to konieczneZaznacz „Generuj powiązane klasy dla metadanych”Zbuduj swoje rozwiązanie ponownie, aby wygenerować „FooDomainContext” na podstawie „FooDomain” w projekcie serwera.

Testowanie:

Pobierzmy dane z MySQL do Silverlight. Zakładając, że istnieje tabela o nazwie „osoby” z nazwą kolumny „nazwa”, możemy powiązać pole listy, aby wyświetlić nazwiska osób.

Najpierw dodaj stronę Silverlight, powiedzmy „Dom”. W Home.xaml dodaj:

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

W pliku Home.xaml.cs dodaj:

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

Zakładamy, że nazwałaś swoją usługę domeny „FooDomain”, a to wygenerowałoby klasę „FooDomainContext”.

Mam nadzieję, że jeśli wszystko zostanie poprawnie skonfigurowane, zobaczysz listę nazw osób podczas uruchamiania projektu Silverlight.

Edytować: ASP.NET nie jest opcjonalny, ale wymagany dla usługi internetowej WCF RIA używanej w moim przykładzie.

29 gru 2013, 07:39 z mjb

Opis:

Krok 1: Utwórz usługi internetowe

Krok 2: Dodaj odwołanie do usługi do Silverlight

Krok 1: Utwórz usługi internetowe

Dodaj nowy projekt Silverlight.

Utwórz nową usługę internetową. Kliknij prawym przyciskiem myszy projekt internetowy> Dodaj> Nowy element

Wybierz „Web Service”.

Kod początkowy nowej usługi internetowej.

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

Aby usługa sieci Web mogła połączyć się z MySQL, musimy dodać referencję MySql.Data.DLL do projektu WWW i dodać instrukcję Using na górze klasy Web Service:

<code>using MySql.Data.MySqlClient; 
</code>

Witaj świecie() to początkowa przykładowa metoda utworzona przez Visual Studio. Możesz go usunąć, ponieważ nie jest potrzebny. Mam zamiar stworzyć 2 prostą metodę, aby zademonstrować, w jaki sposób Web Services są używane do komunikacji między SilverLight a MySQL.

Pierwsza metoda:ExecuteScalar ()

Ta metoda jest prosta. Uzyskaj pojedynczy obiekt z MySQL.

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

Druga metoda:ExecuteNonQuery ()

Dla pojedynczego wykonania SQL. Przykład typu SQL: INSERT, UPDATE, DELETE.

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

Tak wygląda usługa sieci Web po dodaniu dwóch powyższych metod:

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

Zauważysz, że atrybut[WebMethod] jest dodawany do metod.

Przebuduj projekt i pozwól, aby usługa sieci Web była gotowa do następnego kroku.

Uprawnienia dostępu do usługi sieci Web

Należy pamiętać, że domyślnie usługa sieci Web zezwala tylko na dostęp do usługi Silverlight hostowanej w tej samej domenie z usługą sieci Web. Jeśli aplikacja Silverlight jest hostowana na innej stronie / domenie, usługa sieciowa odmówi komunikacji. Dlatego musimy skonfigurować uprawnienia dostępu do usługi sieci Web przez Silverlight, który jest hostowany w innej domenie.

Musisz utworzyć dwa dodatkowe pliki:clientaccesspolicy.xml icrossdomain.xml.

Pliki te muszą być umieszczone w katalogu głównym domeny, w której hostowane są usługi sieci Web.

Przykład:<a href="http://www.mywebsite.com/clientaccesspolicy.xml" rel="nofollow noreferrer">http://www.mywebsite.com/clientaccesspolicy.xml</a> i<a href="http://www.mywebsite.com/crossdomain.xml" rel="nofollow noreferrer">http://www.mywebsite.com/crossdomain.xml</a>

clientaccesspolicy.xml

<code><?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>
</code>

Jeśli chcesz zezwolić na dostęp do usługi sieci Web tylko przez określoną domenę (na przykład: www.myanotherwebsite.com), możesz ją dodać w ramach. Przykład:

<code><?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>
</code>

crossdomain.xml

<code><?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>
</code>

Aby dowiedzieć się więcej na ten temat, przeczytaj:Udostępnianie usługi w granicach domen (MSDN)

Krok 2: Dodaj odwołanie do usługi do Silverlight

Dodaj odwołanie do usługi do Silverlight.

Wpisz adres usługi internetowej i naciśnij [Przejdź].

Przykład adresu:http://www.mywebsite.com/MyCoolWebService.asmx

Zmień przestrzeń nazw na swoją korzyść i naciśnij [OK].

Visual Studio przeanalizuje usługę sieci Web, wykona powiązanie danych i utworzy klasę.

Przed kontynuowaniem kodowania, zobaczmy, jakie metody możemy użyć w nowej utworzonej klasie. Kliknij prawym przyciskiem myszy nową klasę i wybierz [Zobacz w przeglądarce obiektów].

Klasą, której będziemy używać, jest WebService1SoapClient (w tym przykładzie). Nazewnictwo jest oparte na nazwie usługi. Jeśli nazwiemy naszą klasę usług jako MyCoolWebService, to MyCoolWebServiceSoapClient zostanie wybrany jako nazwa klasy w Silverlight. W prawym panelu wyróżnione są dwie metody i dwa zdarzenia. Są to metody używane do wywoływania usług internetowych.

Pozwala stworzyć prostą aplikację Silverlight, dodając pole tekstowe i dwa przyciski.

W tym przykładzie użytkownik wprowadzi zapytanie SQL bezpośrednio do pola tekstowego.

Przycisk [ExecuteScalar] wyśle ​​SQL do usługi sieci Web i odzyska dane. (WYBIERZ, POKAŻ itp.)

Przycisk [ExecuteNonQuery] wyśle ​​SQL do usługi sieci Web tylko w celu wykonania. (INSERT, UPDATE, DELETE itp.)

Oto początkowy kod MainPage.xaml:

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

Oto, co zamierzamy tutaj zrobić:

Zadeklaruj usługę jako obiekt statyczny na poziomie klasy: ServiceReference1.WebService1SoapClientUtwórz zdarzenie zakończone usługi dwóch metod.Zadzwoń do serwisu w przypadku kliknięcia przycisku.Wyświetl wynik usługi: MessageBox.Show ()


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

Naciśnij [F5], uruchom i przetestuj aplikację Silverlight.

Razem z twoją kreatywnością wierzę, że możesz zrobić coś więcej niż teraz :)

Jeśli dokonałeś jakichkolwiek zmian w usłudze internetowej, być może dodałeś nową usługę (nowe metody internetowe), musisz zaktualizować odniesienie do usługi w Silverlight, aby ponownie powiązać usługi. Możesz zaktualizować adres usługi sieciowej, jeśli pliki zostały przesłane na inny hosting.

Szczęśliwe kodowanie.

Czytaj więcej:

Original Post - Łączenie MySQL z SilverLight z Web Services - CodeProject.com (napisane przeze mnie)
Uzyskaj dostęp do usługi sieci Web z aplikacji Silverlight
JAK: Pisanie prostej usługi sieciowej przy użyciu programu Visual C # .NET
Jak: Zbudować usługę dla klientów Silverlight

yourAnswerToTheQuestion