Question

J'ai écrit une petite application de test hello world test dans Silverlight que je souhaite héberger sur un serveur Linux / Apache2. Je veux que les données proviennent de MySQL (ou d’une autre base de données compatible linux) afin que je puisse établir une localisation des données dans la base de données.

J'ai réussi à le faire fonctionner avec Connecteur 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();
}

Cela fonctionne bien si j'accorde une confiance totale à l'application publiée ClickOnce (ou au moins à SocketPermission) et si l'exécute localement .

Je veux que cela s'exécute sur le serveur et je ne parviens pas à le faire fonctionner, avec toujours une exception d'autorisation (SocketPermission n'est pas autorisée).

La base de données est hébergée sur le même serveur que l'application silverlight si cela change quelque chose.

MODIFIER Ok, je comprends maintenant pourquoi c’est une mauvaise idée d’avoir des identifiants de base de données dans l’application cliente (évidemment). Comment fait-on alors? Comment sécurisez-vous le service Web proxy afin qu'il relaie les données vers et depuis le client / la base de données de manière sécurisée? Existe-t-il des exemples sur le Web?

Je ne peux certainement pas être la première personne qui souhaite utiliser une base de données pour alimenter une application Silverlight?

Était-ce utile?

La solution

La façon la plus simple de faire ce que vous voulez (après avoir lu vos modifications maintenant :)) sera d'exposer les services pouvant être consommés. Le modèle actuellement préconisé par Microsoft consiste à exposer les services WCF, mais la vérité est que votre client Silverlight peut utiliser WCF pour consommer de nombreux types de services.

Ce qui peut être plus facile pour vous à l’heure serait d’utiliser un service .NET sur un serveur Web ou peut-être un service REST PHP, puis de diriger votre application Silverlight vers ce service. Ce faisant, vous protégez votre base de données non seulement des personnes qui la parcourent, mais surtout, vous limitez ce que les utilisateurs peuvent faire pour votre base de données. Si vos données sont censées être en lecture seule et que le contrat de votre service ne permet que des opérations de lecture, vous êtes prêt. Sinon, votre service peut négocier des sessions avec des informations d’authentification, à nouveau via WCF.

WCF peut être une plate-forme de connecteur client-serveur ou client-serveur uniquement. Ce que vous choisirez affectera le code que vous écrivez, mais tout sera indépendant de votre base de données. Votre code peut être structuré de manière à correspondre à une correspondance individuelle avec votre table de base de données, ou bien plus abstrait (vous pouvez configurer des classes représentant des vues logiques complètes si vous le souhaitez).

Autres conseils

Alors que le "fonctionnaire" " La solution consiste à utiliser WCF pour transmettre un service à Silverlight. Je pense en effet que les utilisateurs de MySQL n’utiliseraient probablement pas une solution ASP.NET complète. Ma solution consistait à créer un service Web PHP (comme l'a suggéré Rob) pour interagir avec la base de données MySQL et permettre à Silverlight d'y accéder de manière RESTful.

Voici le début d'un didacticiel en trois parties sur l'utilisation de Silverlight pour accéder à une base de données MySQL via un service Web PHP:

PHP , MySQL et Silverlight: Le didacticiel complet

Silverlight n’a aucune possibilité d’accéder directement aux serveurs de base de données. Ce que vous pouvez faire est d'exposer vos opérations de base de données via des services Web (ASMX ou WCF, même non .NET!) Et d'utiliser Silverlight pour accéder à ces services.

Je viens de faire fonctionner cela; Site ASP.NET4 avec contenu Silverlight4 sur serveur Linux Ubuntu 10 / Apache2. Le contenu est développé à l'aide de Visual Studio 2010. VS2008 devrait également fonctionner correctement.

Serveur:

  • Configurez un serveur Linux avec Apache2 et MySQL. Il existe une multitude de guides à ce sujet.
    • Assurez-vous que MySQL est accessible à partir du PC de développement et éventuellement d’Internet. Voir ici pour plus de détails: Causes des erreurs d'accès refusé .
    • Configurez les structures des tables de la base de données et ajoutez du contenu à tester ultérieurement. Dans notre exemple, nous supposons que vous avez la table "personnes" avec la colonne "nom".
  • Silverlight étant une technologie côté client, vous êtes plutôt optimiste et pouvez héberger l'application avec une simple page HTML.
  • Un service Web est requis entre Silverlight et MySQL. Microsoft WCF RIA est une variante, mais requiert .NET. Du côté positif, vous pouvez également héberger des pages ASP.NET4. Voici un guide complet pour l’installer: Configuration de Mono 2.8 avec Asp.Net 4.0 et MVC2 sur Ubuntu avec adhésion à MySql

Visual Studio:

  • Installez le dernier connecteur / réseau MySQL et redémarrez VS
  • .
  • Ajoutez votre base de données MySQL en tant que source de données
    • Ouvrez Explorateur de serveurs - > Ajouter une connexion de données - > Sélectionnez 'Base de données MySQL'
    • Renseignez les informations d'identification et testez la connexion

Configuration du site avec un accès MySQL:

Voici un guide que j'ai trouvé utile: Guide étape par étape de l'application SL4 activée par RIA WCF avec Entity Framework

  • Créez ou ouvrez un projet Silverlight.
    • Le projet côté serveur s'appelle généralement 'ProjectName.Web'
    • Le projet côté client s'appelle généralement 'NomProjet'
  • Ajoutez "Modèle de données d'entité ADO.NET" au projet de serveur. Ce sera un modèle de votre structure de base de données.
    • Sélectionnez "Générer à partir de la base de données"
    • Choisissez la connexion à la base de données MySQL que vous avez créée
    • Sélectionnez les tables auxquelles vous souhaitez accéder
  • Générez votre solution maintenant avant de poursuivre.
  • Ajouter 'Classe de service de domaine' au projet de serveur, f.ex. 'FooDomain'. Cela rendra les entités de base de données disponibles pour le code Silverlight côté client.
    • Dans 'Classes DataContext / ObjectContext disponibles:', sélectionnez le modèle Entity Framework que vous avez créé à l'étape précédente.
    • Cochez les entités auxquelles vous souhaitez accéder et cochez la case "Activer l'édition" le cas échéant
    • Cochez la case "Générer des classes associées pour les métadonnées"
  • Générez à nouveau votre solution pour générer "FooDomainContext", basé sur "FooDomain" dans le projet de serveur.

Test:

Importons les données de MySQL dans Silverlight. En supposant qu'il existe une table nommée 'personnes' avec le nom de colonne 'nom', nous pouvons lier une zone de liste pour afficher les noms des personnes.

Ajoutez d’abord une page Silverlight, disons «Accueil». Dans Home.xaml, ajoutez:

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

Dans le fichier Home.xaml.cs, ajoutez:

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

Nous supposons ici que vous avez nommé votre service de domaine 'FooDomain', ce qui générerait la classe 'FooDomainContext' utilisée.

Espérons que, si tout est configuré correctement, vous verrez maintenant une liste de noms de personnes lors de l'exécution de votre projet Silverlight.

Modifier: ASP.NET n'est pas facultatif, mais requis pour le service Web WCF RIA utilisé dans mon exemple.

Avoir des connexions de base de données directement au serveur du côté client est généralement une mauvaise idée. Je ne sais pas à quel point il est facile de décompiler une application Silverlight, mais je suppose que c'est possible d'une certaine manière. Ensuite, vous donnez essentiellement vos informations d'identification à vos utilisateurs.

Vous pouvez obtenir des données à partir de MySQL en utilisant les services Web.

Procédure pas à pas:

Étape 1: Créer des services Web

Étape 2: Ajouter une référence de service à Silverlight


Étape 1: Créer des services Web

Ajouter un nouveau projet Silverlight.

Ajouter un nouveau projet Silverlight

Créez un nouveau service Web. Cliquez avec le bouton droit sur le projet Web > Ajouter > Nouvel élément

Créer un nouveau service Web

Sélectionnez "Service Web".

entrer la description de l'image ici

Code initial d'un nouveau service Web.

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

Pour que le service Web puisse se connecter à MySQL, nous devons ajouter une référence à MySql.Data.DLL dans le projet Web et ajouter l'instruction Using en haut de la classe de service Web:

using MySql.Data.MySqlClient; 

HelloWorld () est un exemple de méthode initial créé par Visual Studio. Vous voudrez peut-être le supprimer car ce n'est pas nécessaire. Je vais créer deux méthodes simples pour montrer comment les services Web sont utilisés pour communiquer entre SilverLight et MySQL.

Première méthode: ExecuteScalar ()

Cette méthode est simple. Obtenez un seul objet de 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;
    }
} 

Deuxième méthode: ExecuteNonQuery ()

Pour une exécution SQL unique. Exemple de type 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;
    }
}  

Voici à quoi ressemble le service Web après avoir ajouté les deux méthodes ci-dessus:

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

Vous remarquerez qu'un attribut [WebMethod] est ajouté aux méthodes.

Reconstruisez le projet et laissez le service Web prêt pour l'étape suivante.

Reconstruire le projet

Autorisation d'accès au service Web

Veuillez noter que, par défaut, le service Web n'autorise l'accès qu'aux personnes Silverlight hébergées dans le même domaine que le service Web. Si l'application Silverlight est hébergée sur un autre site Web / domaine, Web Service refusera la communication. Par conséquent, nous devons configurer l'autorisation d'accès au service Web par Silverlight, hébergé sur un domaine différent.

Vous devez créer deux fichiers supplémentaires: clientaccesspolicy.xml et crossdomain.xml .

Ces fichiers doivent être placés à la racine du domaine où les services Web sont hébergés.

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

Si vous souhaitez uniquement autoriser l'accès au service Web par un domaine spécifique (par exemple, www.myanotherwebsite.com), vous pouvez l'ajouter à l'intérieur. Exemple:

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

Pour en savoir plus à ce sujet, veuillez lire: Mise à disposition d'un service sur plusieurs frontières de domaine (MSDN)

Étape 2: ajout d'une référence de service à Silverlight

Ajouter une référence de service à Silverlight.

Ajouter une référence de service à Silverlight

Saisissez l'adresse du service Web et appuyez sur [Go].

Exemple d'adresse: http://www.mywebsite.com/MyCoolWebService.asmx

Modifiez l’espace de nom en votre faveur et appuyez sur [OK].

Navigateur de services Web

Visual Studio analysera le service Web, établira la liaison de données et créera une classe.

Avant de continuer à coder, voyons quelles méthodes nous pouvons utiliser dans la nouvelle classe créée. Cliquez avec le bouton droit de la souris sur la nouvelle classe et sélectionnez [Afficher dans l'explorateur d'objets].

Afficher dans le navigateur d'objets

La classe que nous allons utiliser est WebService1SoapClient (dans cet exemple). La dénomination est basée sur le nom du service. Si nous appelons notre classe de service MyCoolWebService, alors MyCoolWebServiceSoapClient sera choisi comme nom de la classe dans Silverlight. Dans le panneau de droite, deux méthodes et deux événements sont mis en évidence. Ce sont les méthodes utilisées pour appeler les services Web.

Objet de WebService1SoapClient

Permet de créer une application Silverlight simple en ajoutant une zone de texte et deux boutons.

Dans cet exemple, l'utilisateur saisira la requête SQL directement dans la zone de texte.

Le bouton de [ExecuteScalar] enverra le code SQL au service Web et récupérera les données. (SELECT, SHOW, etc.)

Le bouton de [ExecuteNonQuery] enverra le code SQL au service Web pour exécution uniquement. (INSERT, UPDATE, DELETE, etc.)

Concevoir une application SilverLight simple

C’est le code initial derrière 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)
        {
        }
    }
}

Maintenant, voici ce que nous allons faire ici:

  • Déclarez le service en tant qu'objet statique au niveau de la classe: ServiceReference1.WebService1SoapClient
  • Créez l'événement de service terminé des deux méthodes.
  • Appelez le service en cas de clic sur un bouton.
  • Afficher le résultat du service: 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);
    }
}

Appuyez sur [F5], lancez et testez l'application Silverlight.

Test

Test

Test

Avec votre créativité, je pense que vous pouvez faire quelque chose de plus que cela pour le moment. Souriez | :)

Si vous avez apporté des modifications au service Web, peut-être avez-vous ajouté un nouveau service (nouvelles méthodes Web), vous devez mettre à jour la référence du service dans Silverlight pour relier les services. Vous voudrez peut-être mettre à jour l'adresse du service Web si vous avez chargé les fichiers sur un autre hébergement Web.

mettre à jour la référence du service

Joyeux codage.

En savoir plus:

  1. Message d'origine - Connexion de MySQL à SilverLight Avec les services Web - CodeProject.com (écrit par moi)
  2. Accéder à un service Web à partir de une application Silverlight
  3. COMMENT FAIRE: Écrire un service Web simple à l'aide de Visual C # .NET
  4. Comment: créer un service pour Clients Silverlight
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top