Wie bekommt man Silverlight von MySQL?

Ich habe eine kleine Hello World-Test-App in Silverlight geschrieben, die ich auf einem Linux / Apache2-Server hosten möchte. Ich möchte, dass die Daten von MySQL (oder einer anderen Linux-kompatiblen Datenbank) stammen, damit ich Daten an die Datenbank binden kann.

Ich habe es geschafft, es zum Laufen zu bringen, indem ich dieMySQL 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>

Dies funktioniert einwandfrei, wenn ich der veröffentlichten ClickOnce-App volles Vertrauen gebe (oder zumindest SocketPermission) undFühren Sie es lokal aus.

Ich möchte, dass dies auf dem Server ausgeführt wird, und ich kann es nicht zum Laufen bringen, was immer mit einer Berechtigungsausnahme endet (SocketPermission ist nicht zulässig).

Die Datenbank wird auf demselben Server wie die Silverlight-App gehostet, wenn dies einen Unterschied macht.

BEARBEITEN Ok, ich verstehe jetzt, warum es eine schlechte Idee ist, DB-Anmeldeinformationen in der Client-App zu haben (offensichtlich). Wie machen die Leute das dann? Wie sichern Sie den Proxy-Webdienst, damit er Daten auf sichere Weise an und von Client / DB weiterleitet? Gibt es Beispiele im Internet?

Sicherlich kann ich nicht die erste Person sein, die eine Datenbank zum Betreiben einer Silverlight-Anwendung verwenden möchte?

Antworten auf die Frage(6)

ASP.NET4-Site mit Silverlight4-Inhalten auf Linux Ubuntu 10 / Apache2-Servern. Der Inhalt wird mit Visual Studio 2010 entwickelt. Auch VS2008 sollte einwandfrei funktionieren.

Server:

Richten Sie einen Linux-Server mit Apache2 und MySQL ein, es gibt jede Menge Anleitungen dazu.Stellen Sie sicher, dass MySQL vom Entwicklungs-PC und optional vom Internet aus zugänglich ist. Einzelheiten finden Sie hier:Ursachen für Fehler, denen der Zugriff verweigert wurde.Richten Sie die Datenbanktabellenstrukturen ein und fügen Sie Inhalte zum späteren Testen hinzu. In unserem Beispiel wird davon ausgegangen, dass Sie die Tabelle 'Personen' mit der Spalte 'Name' haben.Da es sich bei Silverlight um eine clientseitige Technologie handelt, können Sie die Anwendung auf einer einfachen HTML-Seite hosten.Zwischen Silverlight und MySQL ist ein Webdienst erforderlich. Microsofts WCF-RIA ist eine Variante, erfordert jedoch .NET. Auf der positiven Seite können Sie auch ASP.NET4-Seiten hosten. Hier ist eine gründliche Anleitung zum Einrichten:Einrichten von Mono 2.8 mit Asp.Net 4.0 und MVC2 unter Ubuntu mit MySql-Mitgliedschaft

Visual Studio:

Neueste installierenMySQL Connector / Net und starten Sie VS neuFügen Sie Ihre MySQL-Datenbank als Datenquelle hinzuÖffnen Sie den Server Explorer -> Datenverbindung hinzufügen -> Wählen Sie 'MySQL-Datenbank'Füllen Sie die Anmeldeinformationen aus und testen Sie die Verbindung

Einrichten der Site mit MySQL-Zugriff:

Hier ist eine Anleitung, die ich hilfreich fand:Schrittweise Anleitung zur WCF RIA-fähigen SL4-Anwendung mit Entity Framework

Erstellen oder öffnen Sie ein Silverlight-Projekt.Das serverseitige Projekt heißt normalerweise "ProjectName.Web".Das clientseitige Projekt heißt normalerweise "ProjectName".Fügen Sie dem Serverprojekt "ADO.NET Entity Data Model" hinzu. Dies ist ein Modell Ihrer Datenbankstruktur.Wählen Sie "Aus Datenbank generieren".Wählen Sie die von Ihnen erstellte MySQL-DatenbankverbindungWählen Sie die Tabellen aus, auf die Sie zugreifen möchtenErstellen Sie jetzt Ihre Lösung, bevor Sie fortfahren.Fügen Sie dem Serverprojekt 'Domain Service Class' hinzu, z. 'FooDomain'. Dadurch werden die Datenbankentitäten für den clientseitigen Silverlight-Code verfügbar.Wählen Sie unter "Verfügbare DataContext- / ObjectContext-Klassen" das Entity Framework-Modell aus, das Sie im vorherigen Schritt erstellt haben.Aktivieren Sie die Entitäten, auf die Sie zugreifen möchten, und aktivieren Sie gegebenenfalls die Option "Bearbeitung aktivieren"Aktivieren Sie das Kontrollkästchen "Verknüpfte Klassen für Metadaten generieren".Erstellen Sie Ihre Lösung erneut, um 'FooDomainContext' basierend auf 'FooDomain' im Serverprojekt zu generieren.

Testen:

Lassen Sie uns Daten aus MySQL in Silverlight übernehmen. Angenommen, es gibt eine Tabelle mit dem Namen 'Personen' und der Spalte 'Name', können wir ein Listenfeld binden, um die Namen der Personen anzuzeigen.

Fügen Sie zuerst eine Silverlight-Seite hinzu, sagen wir 'Home'. In Home.xaml fügen Sie hinzu:

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

Fügen Sie in der Datei Home.xaml.cs Folgendes hinzu:

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

Hier nehmen wir an, dass Sie Ihren Domain-Service "FooDomain" genannt haben und dies die verwendete Klasse "FooDomainContext" generieren würde.

Wenn alles richtig eingerichtet ist, sehen Sie jetzt hoffentlich eine Liste mit Personennamen, wenn Sie Ihr Silverlight-Projekt ausführen.

Bearbeiten: ASP.NET ist nicht optional, aber für den in meinem Beispiel verwendeten WCF-RIA-Webdienst erforderlich.

Lösung für das Problem

das zu tun, was Sie wollen (nachdem Sie Ihre Änderungen gelesen haben :), besteht darin, Dienste freizugeben, die konsumiert werden können. Microsoft drängt derzeit WIRKLICH darauf, WCF-Dienste verfügbar zu machen. In Wahrheit kann Ihr Silverlight-Client jedoch WCF verwenden, um viele verschiedene Arten von Diensten zu nutzen.

Für Sie ist es möglicherweise am einfachsten, einen .NET-Dienst auf einem Webserver oder vielleicht einen PHP-REST-Dienst zu verwenden und dann Ihre Silverlight-App auf diesen Dienst zu verweisen. Auf diese Weise schützen Sie Ihre Datenbank nicht nur vor herumschnüffelnden Personen, sondern Sie schränken vor allem ein, was Benutzer mit Ihrer Datenbank tun können. Wenn Ihre Daten schreibgeschützt sein sollen und der Vertrag Ihres Dienstes nur Lesevorgänge zulässt, sind Sie eingestellt. Alternativ kann Ihr Dienst Sitzungen mit Anmeldeinformationen aushandeln, die erneut über WCF eingerichtet wurden.

WCF kann eine Nur-Client-, Nur-Server- oder Client-Server-Connector-Plattform sein. Was Sie wählen, wirkt sich auf den Code aus, den Sie schreiben, aber alles wird unabhängig von Ihrer Datenbank sein. Ihr Code kann so strukturiert sein, dass er Ihrer Datenbanktabelle eins zu eins zugeordnet wird, oder er kann weitaus abstrakter sein (Sie können Klassen einrichten, die vollständige logische Ansichten darstellen, wenn Sie dies wünschen).

Exemplarische Vorgehensweise:

Schritt 1: Erstellen Sie Webdienste

Schritt 2: Servicereferenz zu Silverlight hinzufügen

Schritt 1: Erstellen Sie Webdienste

Fügen Sie ein neues Silverlight-Projekt hinzu.

Erstellen Sie einen neuen Webdienst. Klicken Sie mit der rechten Maustaste auf das Webprojekt> Hinzufügen> Neues Element

Wählen Sie "Web Service".

Anfangscode eines neuen Webdienstes.

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

Damit der Webdienst eine Verbindung zu MySQL herstellen kann, müssen Sie dem Webprojekt einen Verweis auf MySql.Data.DLL hinzufügen und die Using-Anweisung oben in der Webdienstklasse hinzufügen:

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

Hallo Welt() ist eine erste Beispielmethode, die von Visual Studio erstellt wurde. Möglicherweise möchten Sie es löschen, da es nicht benötigt wird. Ich werde 2 einfache Methoden erstellen, um zu demonstrieren, wie Webdienste für die Kommunikation zwischen SilverLight und MySQL verwendet werden.

Erste Methode:ExecuteScalar ()

Diese Methode ist einfach. Holen Sie sich ein einzelnes Objekt aus 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>

Zweite Methode:ExecuteNonQuery ()

Für einzelne SQL-Ausführung. Beispiel für den SQL-Typ: 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>

So sieht der Web-Service aus, nachdem die beiden oben genannten Methoden hinzugefügt wurden:

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

Sie werden feststellen, dass ein Attribut von[WebMethod] wird zu den Methoden hinzugefügt.

Erstellen Sie das Projekt neu und warten Sie, bis der Webdienst für den nächsten Schritt bereit ist.

Zugriffsberechtigung für Webdienste

Beachten Sie, dass der Webdienst standardmäßig nur denjenigen Silverlight-Benutzern den Zugriff gewährt, die in derselben Domäne wie der Webdienst gehostet werden. Wenn die Silverlight-Anwendung auf einer anderen Website / Domain gehostet wird, verweigert der Webdienst die Kommunikation. Daher müssen wir die Berechtigung für den Zugriff auf den Webdienst durch Silverlight konfigurieren, der in einer anderen Domäne gehostet wird.

Sie müssen zwei zusätzliche Dateien erstellen:clientaccesspolicy.xml undcrossdomain.xml.

Diese Dateien müssen im Stammverzeichnis der Domäne abgelegt werden, in der die Webdienste gehostet werden.

Beispiel:<a href="http://www.mywebsite.com/clientaccesspolicy.xml" rel="nofollow noreferrer">http://www.mywebsite.com/clientaccesspolicy.xml</a> und<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>

Wenn Sie nur zulassen möchten, dass auf den Webdienst über eine bestimmte Domain zugegriffen werden kann (Beispiel: www.myanotherwebsite.com), können Sie ihn hinzufügen. Beispiel:

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

Um mehr darüber zu erfahren, lesen Sie bitte:Bereitstellen eines Dienstes über Domänengrenzen hinweg (MSDN)

Schritt 2: Servicereferenz zu Silverlight hinzufügen

Fügen Sie einen Dienstverweis zu Silverlight hinzu.

Geben Sie die Adresse des Webdienstes ein und drücken Sie [Los].

Adressbeispiel:http://www.mywebsite.com/MyCoolWebService.asmx

Ändern Sie den Namespace zu Ihren Gunsten und drücken Sie [OK].

Visual Studio analysiert den Webdienst, nimmt die Datenbindung vor und erstellt eine Klasse.

Bevor Sie mit dem Codieren fortfahren, sehen wir uns an, welche Methoden in der neu erstellten Klasse verwendet werden können. Klicken Sie mit der rechten Maustaste auf die neue Klasse und wählen Sie [Im Objektbrowser anzeigen].

Die Klasse, die wir verwenden werden, ist WebService1SoapClient (in diesem Beispiel). Die Benennung basiert auf dem Dienstnamen. Wenn wir unsere Serviceklasse als MyCoolWebService bezeichnen, wird MyCoolWebServiceSoapClient als Name der Klasse in Silverlight ausgewählt. Im rechten Bereich werden zwei Methoden und zwei Ereignisse hervorgehoben. Dies sind die Methoden zum Aufrufen der Webdienste.

Erstellen Sie eine einfache Silverlight-Anwendung, indem Sie ein Textfeld und zwei Schaltflächen hinzufügen.

In diesem Beispiel gibt der Benutzer die SQL-Abfrage direkt in das Textfeld ein.

Die Schaltfläche [ExecuteScalar] sendet die SQL an den Webdienst und ruft die Daten zurück. (SELECT, SHOW usw.)

Mit der Schaltfläche [ExecuteNonQuery] wird der SQL-Code nur zur Ausführung an den Webdienst gesendet. (EINFÜGEN, AKTUALISIEREN, LÖSCHEN usw.)

Dies ist der ursprüngliche Code hinter 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>

Nun, das werden wir hier machen:

Deklarieren Sie den Service als statisches Objekt auf Klassenebene: ServiceReference1.WebService1SoapClientErstellen Sie das Ereignis "Service erledigt" für beide Methoden.Rufen Sie den Service bei einem Klick auf die Schaltfläche an.Zeigen Sie das Service-Ergebnis an: 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>

Drücken Sie [F5], führen Sie die Silverlight-Anwendung aus und testen Sie sie.

Ich glaube, Sie können mit Ihrer Kreativität vorerst noch etwas anderes tun :)

Wenn Sie Änderungen am Webdienst vorgenommen haben, möglicherweise einen neuen Dienst hinzugefügt haben (neue Webmethoden), müssen Sie die Dienstreferenz bei Silverlight aktualisieren, um die Dienste erneut zu binden. Möglicherweise möchten Sie die Webdienstadresse aktualisieren, wenn Sie die Dateien auf ein anderes Webhosting hochgeladen haben.

Fröhliches Codieren.

Weiterlesen:

Originaler Beitrag - Verbinden von MySQL von SilverLight mit Web Services - CodeProject.com (von mir geschrieben)
Greifen Sie über eine Silverlight-Anwendung auf einen Webdienst zu
SO WIRD'S GEMACHT: Schreiben Sie einen einfachen Webdienst mithilfe von Visual C # .NET
Gewusst wie: Erstellen eines Dienstes für Silverlight-Clients

n Ihre Datenbankoperationen über Webdienste (ASMX oder WCF, auch Nicht-.NET!) Verfügbar machen und Silverlight für den Zugriff auf diese Dienste verwenden.

 Isak Savo19. Sept. 2008, 09:53
Aber ich kann mit der DB sprechen, ich darf nur nicht. Warum ist es erlaubt, mit einem Webdienst (über http, nehme ich an?) Zu sprechen, aber nicht mit einer Datenbank?

offizielle" Antwort darin besteht, einen Dienst mit WCF an Silverlight weiterzuleiten, gehe ich davon aus, dass jeder, der MySQL verwendet, wahrscheinlich keine vollständige ASP.NET-Lösung verwenden würde. Meine Lösung bestand darin, einen PHP-Webservice (wie von Rob vorgeschlagen) zu erstellen, um mit der MySQL-Datenbank zu interagieren und den Silverlight-Zugriff auf eine REST-konforme Weise zu ermöglichen.

Hier ist der Beginn eines dreiteiligen Tutorials für die Verwendung von Silverlight, um über einen PHP-Webdienst auf eine MySQL-Datenbank zuzugreifen:

PHP, MySQL und Silverlight: Das komplette Tutorial

ist normalerweise eine schlechte Idee. Ich weiß nicht, wie einfach es ist, eine Silverlight-App zu dekompilieren, aber ich denke, es ist irgendwie möglich. Dann geben Sie im Grunde Ihre DB-Anmeldeinformationen an Ihre Benutzer weiter.

Ihre Antwort auf die Frage