Frage

Ich habe eine kleine Hallo-Welt-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 Dinge in der Datenbank binden kann.

Ich habe es geschafft, es mit dem zum Laufen zu bringen 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();
}

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

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

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

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

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

War es hilfreich?

Lösung

Der einfachste Weg zu tun, was Sie wollen (durch Ihre Änderungen :) jetzt gelesen zu haben) werden Dienste aussetzen, die verbraucht werden kann. Das Muster, das Microsoft ist jetzt wirklich drückt, ist WCF-Dienste auszusetzen, aber die Wahrheit ist, dass Silverlight-Client WCF verwenden können viele verschiedene Arten von Dienstleistungen zu konsumieren.

Was am einfachsten sein kann für Dich jetzt wäre zu tun, um einen .NET-Dienst auf einem Web-Server zu verwenden, oder vielleicht einen PHP REST-Dienst, und dann Silverlight-Anwendung zu diesem Dienst zeigen. Dadurch, sind zu schützen Sie Ihre Datenbank nicht nur von Menschen durch sie Snooping, aber noch wichtiger ist, Sie zu beschränken, was die Leute auf Ihre Datenbank zu tun. Wenn Ihre Daten soll schreibgeschützt werden, und Ihr Service Vertrag erlaubt nur Leseoperationen, sind Sie eingestellt. Alternativ können Sie die Service-Sitzungen mit Anmeldeinformationen verhandeln kann wieder durch WCF einrichten.

WCF kann eine Client-only sein, Server-only oder Client-Server-Anschluss-Plattform. Was Sie wählen, wird der Code beeinflussen Sie schreiben, aber es ist alles unabhängig von Ihrer Datenbank sein wird. Ihr Code so kann strukturiert, dass es eine Eins-zu-Eins-Abbildung zu Ihrer Datenbank-Tabelle, oder es kann viel mehr abstrakt sein (man Klassen einrichten kann, die vollen logische Ansichten darstellen, wenn Sie wählen).

Andere Tipps

Während die „offizielle“ Antwort ist WCF zu verwenden, um einen Dienst, um Silverlight zu schieben, ich irgendwie herausfinden, dass jemand MySQL würde wahrscheinlich nicht eine vollständige ASP.NET-Lösung verwenden. Meine Lösung war ein PHP-Webservice zu bauen (wie Rob vorgeschlagen) mit der MySQL-Datenbank zu interagieren und den Silverlight-Zugriff in einer RESTful Weise hat.

Hier beginnt eine dreiteilige Tutorial für Silverlight mit einer MySQL-Datenbank über einen PHP-Web-Dienst zuzugreifen:

PHP , MySQL und Silverlight: Die kompletten Tutorial

Silverlight hat keine Fähigkeit zum direkten Datenbankserver zuzugreifen. Was Sie tun können, ist Ihre Datenbank-Operationen durch Web-Service (ASMX oder WCF, auch non-.NET!) Zu belichten und verwenden Silverlight diese Dienste zugreifen zu können.

Ich habe gerade diese Arbeit; ASP.NET4 Website mit Silverlight4 Inhalt auf Linux Ubuntu 10 / Apache2-Server. Der Inhalt wird entwickelt unter Verwendung von Visual Studio 2010 VS2008 sollte auch gut funktionieren.

Server:

  • Setup einen Linux-Server mit Apache 2 und MySQL, gibt es Tonnen von Leitfäden zu diesem Thema.
    • Stellen Sie sicher, dass MySQL ist von der Entwicklung PC und gegebenenfalls aus dem Internet. Sehen Sie hier für weitere Details: Gründe für Access-Denied Fehler .
    • Setup die Datenbank Tabellenstrukturen und später einige Inhalte für die Prüfung hinzufügen. In unserem Beispiel gehen wir davon aus Sie die Tabelle ‚Personen‘ mit der Spalte ‚Name‘ haben.
  • Da Silverlight ist eine clientseitige Technologie, die Sie ziemlich gut zu gehen und um die Anwendung mit einem einfachen HTML-Seite hosten kann.
  • Ein Web-Service ist zwischen Silverlight und MySQL erforderlich. Microsoft WCF RIA ist ein Geschmack, aber erfordert .NET. Auf der Plusseite, erhalten Sie ASP.NET4 Seiten als auch zu hosten. Hier ist eine gründliche Anleitung zur Einrichtung zusammen: Einrichten Mono 2.8 mit Asp.Net 4.0 und MVC2 auf Ubuntu mit mySql Mitgliedschaft

Visual Studio:

  • Installieren Sie die neueste MySQL Connector / Net und starten VS
  • Fügen Sie Ihre MySQL-Datenbank als Datenquelle
    • Öffnen Sie den Server-Explorer -> Add-Datenverbindung -> Wählen Sie 'MySQL Datenbank'
    • Füllen Sie Anmeldeinformationen und Testverbindung

Zur Einstellung der Website mit MySQL Zugriff auf:

Hier ist eine Anleitung, die ich gefunden hilfreich: Schritt für Schritt Anleitung zur WCF RIA aktiviert SL4 Anwendung mit Entity Framework

  • Erstellen oder Silverlight-Projekt öffnen.
    • Die serverseitige Projekt wird in der Regel dem Namen ‚ProjectName.Web‘
    • Die clientseitige Projekt wird in der Regel dem Namen ‚Projektname‘
  • Add 'ADO.NET Entity Data Model' auf dem Server-Projekt. Dies wird ein Modell Ihrer Datenbankstruktur sein.
    • Wählen Sie 'Generieren von Datenbank'
    • Wählen Sie die MySQL-Datenbank-Verbindung, die Sie erstellt
    • die Tabellen Wählen Sie zugreifen möchten
  • Erstellen Sie Ihre Lösung jetzt, bevor Sie fortfahren.
  • Add 'Domain Service Class' auf dem Server-Projekt, zb 'FooDomain'. Dies wird die Datenbankentitäten zur Verfügung, die clientseitige Silverlight-Code vornehmen.
    • In 'Verfügbar Datacontext / Object Klassen:'. Wählen Sie das Entity Framework-Modell Sie im vorherigen Schritt erstellt
    • die Entitäten Überprüfen Sie zugreifen möchten und überprüfen ‚enable Bearbeitung‘ gegebenenfalls
    • Überprüfen Sie 'Gene zugehörigen Klassen für Metadaten'
  • Erstellen Sie Ihre Lösung erneut zu generieren ‚FooDomainContext‘, basierend auf ‚FooDomain‘ in Server-Projekt.

Test:

Lassen Sie uns Daten aus MySQL in Silverlight erhalten. Unter der Annahme, gibt es eine Tabelle ‚Personen‘ mit Spaltennamen ‚name‘ genannt, können wir ein Listenfeld binden, die Namen der Personen zu zeigen.

Zuerst eine Silverlight-Seite hinzufügen, sagen wir mal ‚Home‘. In Home.xaml hinzufügen:

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

In Home.xaml.cs Datei hinzugefügt werden:

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

Hier nehmen wir an, Sie Ihren Domain-Dienst mit dem Namen ‚FooDomain‘, und das ist der ‚FooDomainContext‘ Klasse verwendet würde erzeugen.

Wir hoffen, wenn alles richtig eingerichtet ist, werden Sie nun eine Liste von Personennamen sehen, wenn Ihr Silverlight-Projekt ausgeführt wird.

Edit:. ASP.NET ist nicht optional, sondern auch für den WCF RIA Web-Service in meinem Beispiel verwendete erforderlich

DB-Verbindungen direkt an den Server von der Client-Seite

zu haben, ist in der Regel eine schlechte Idee. Ich weiß nicht, wie einfach es ist, eine Silverlight-Anwendung zu dekompilieren, aber ich würde vermuten, es möglich ist, in gewisser Weise. Dann sind Sie im Grunde Ihre DB-Anmeldeinformationen für Ihre Benutzer verlosen.

Sie können Daten von MySQL mithilfe von Webdiensten abrufen.

Komplettlösung:

Schritt 1:Erstellen Sie Webdienste

Schritt 2:Fügen Sie eine Dienstreferenz zu Silverlight hinzu


Schritt 1:Erstellen Sie Webdienste

Fügen Sie ein neues Silverlight-Projekt hinzu.

Add a new Silverlight project

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

Create a new Web Service

Wählen Sie „Webdienst“.

enter image description here

Ursprünglicher Code eines neuen Webdienstes.

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

Damit der Webdienst eine Verbindung zu MySQL herstellen kann, müssen wir eine Referenz von MySql.Data.DLL zum Webprojekt hinzufügen und die Using-Anweisung oben in der Webdienstklasse hinzufügen:

using MySql.Data.MySqlClient; 

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

Zweite Methode: ExecuteNonQuery()

Für einzelne SQL-Ausführung.Beispiel für einen SQL-Typ:EINFÜGEN, AKTUALISIEREN, LÖSCHEN.

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

So sieht der Webdienst nach dem Hinzufügen der beiden oben genannten Methoden aus:

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

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

Erstellen Sie das Projekt neu und lassen Sie den Webdienst für den nächsten Schritt bereit sein.

Rebuild the project

Zugriffsberechtigung für Webdienste

Bitte beachten Sie, dass der Webdienst standardmäßig nur den Zugriff auf Silverlight zulässt, das in derselben Domäne wie der Webdienst gehostet wird.Wenn die Silverlight-Anwendung auf einer anderen Website/Domäne 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 Und crossdomain.xml.

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

Beispiel: http://www.mywebsite.com/clientaccesspolicy.xml Und 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>

Wenn Sie nur den Zugriff auf den Webdienst durch eine bestimmte Domäne zulassen möchten (Beispiel:www.myanotherwebsite.com), Sie können es innerhalb hinzufügen.Beispiel:

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

Um mehr darüber zu erfahren, lesen Sie bitte: Einen Dienst über Domänengrenzen hinweg verfügbar machen (MSDN)


Schritt 2:Fügen Sie eine Dienstreferenz zu Silverlight hinzu

Fügen Sie Silverlight eine Dienstreferenz hinzu.

Add a Service Reference to Silverlight

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

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

Ändern Sie den Namespace nach Ihren Wünschen und klicken Sie auf [OK].

Web Service Browser

Visual Studio analysiert den Webdienst, führt die Datenbindung durch und erstellt eine Klasse.

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

View in Object Browser

Die Klasse, die wir verwenden werden, ist WebService1SoapClient (in diesem Beispiel).Die Benennung basiert auf dem Dienstnamen.Wenn wir unsere Serviceklasse „MyCoolWebService“ nennen, 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.

Object of WebService1SoapClient

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

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

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

Die Schaltfläche [ExecuteNonQuery] sendet die SQL nur zur Ausführung an den Webdienst.(EINFÜGEN, AKTUALISIEREN, LÖSCHEN usw.)

Design a simple SilverLight App

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

Nun, das werden wir hier tun:

  • Deklarieren Sie den Dienst als statisches Objekt auf Klassenebene:ServiceReference1.WebService1SoapClient
  • Erstellen Sie das Service-Abgeschlossen-Ereignis der beiden Methoden.
  • Rufen Sie den Dienst an, wenn Sie auf die Schaltfläche klicken.
  • Serviceergebnis anzeigen: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);
    }
}

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

Testing

Testing

Testing

Zusammen mit Ihrer Kreativität glaube ich, dass Sie vorerst etwas mehr tun können als dieses Lächeln | :)

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

update the Service Reference

Viel Spaß beim Codieren.

Mehr lesen:

  1. Ursprünglicher Beitrag – MySQL von SilverLight mit Webdiensten verbinden – CodeProject.com (von mir geschrieben)
  2. Greifen Sie über eine Silverlight-Anwendung auf einen Webdienst zu
  3. WIE MAN:Schreiben Sie einen einfachen Webdienst mit Visual C# .NET
  4. Wie man:Erstellen Sie einen Dienst für Silverlight-Clients
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top