Domanda

Ho scritto un piccolo hello world applicazione di test in Silverlight che voglio ospitare su Linux/Apache 2 server.Voglio i dati da MySQL (o qualche altro compatibile con linux db) in modo che io possa databind le cose nel db.

Sono riuscito a farlo funzionare utilizzando il 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();
}

Questo funziona bene se mi danno l'pubblicato ClickOnce app completa fiducia (o almeno SocketPermission) e eseguirlo in locale.

Voglio questo per l'esecuzione sul server e non riesco a farlo funzionare, sempre a finire con il permesso di eccezione (SocketPermission non è consentito).

Il database è ospitato sullo stesso server l'applicazione silverlight se questo fa alcuna differenza.

MODIFICA Ok, ora capisco perché è una cattiva idea di avere db credenziali del client app (ovviamente).Come si fa a fare questo?Come proteggere il proxy del servizio web in modo che i relè di dati da e per il cliente/db in modo sicuro?Ci sono esempi sul web?

Sicuramente, io non posso essere la prima persona che si desidera utilizzare un database per l'alimentazione di un'applicazione silverlight?

È stato utile?

Soluzione

Il modo più semplice per fare quello che vuoi (dopo aver letto attraverso le modifiche ora :)) sarà per l'esposizione di servizi che possono essere consumati.Il modello che Microsoft sta spingendo a destra ora è quello di esporre i servizi WCF, ma la verità è che il client Silverlight può usare WCF di consumare un sacco di diversi tipi di servizi.

Che cosa potrebbe essere più semplice da fare sarebbe quella di utilizzare un .NET service su un server web o forse un PHP RESTO del servizio, e quindi punto di Silverlight app a quel servizio.Così facendo, si sta proteggendo il vostro database non solo da persone snooping attraverso di essa, ma, cosa più importante, sei limitare ciò che la gente può fare per il vostro database.Se i dati si suppone essere di sola lettura, e il contratto del servizio consente solo operazioni di lettura, si sta insieme.In alternativa, il servizio può negoziare con sessioni di credenziali, di nuovo, tramite WCF.

WCF può essere un solo client, server o client-server connettore piattaforma.Ciò che si sceglie influenzerà il codice che si scrive, ma è tutto sta per essere indipendenti dal vostro database.Il codice può essere strutturato in modo tale che si tratta di un one-to-one mapping per la vostra tabella di database, o può essere molto più astratto (è possibile impostare le classi che rappresentano l'intero viste logiche se si sceglie).

Altri suggerimenti

Mentre per la versione "ufficiale" la risposta è usare WCF per spingere un servizio di Silverlight, che tipo di figura che chiunque l'utilizzo di MySQL sarebbe probabilmente non essere utilizzando un completo ASP.NET soluzione.La mia soluzione era quella di costruire un PHP webservice (come Rob suggerito) per interagire con il database MySQL e hanno Silverlight accedere in modalità RESTful.

Qui è l'inizio di una da parte di tre tutorial per l'utilizzo di Silverlight per accedere a un database MySQL tramite PHP, web service:

PHP, MySQL e Silverlight:Il Tutorial Completo

Silverlight non hanno alcuna possibilità di accedere direttamente ai server di database.Che cosa si può fare è quello di esporre le operazioni di database attraverso web services ASMX o WCF, anche non-.NET!) e l'uso di Silverlight per accedere a tali servizi.

Ho appena ricevuto questo lavoro;ASP.NET4 sito con Silverlight4 contenuti su Linux Ubuntu 10 / Apache2 server.Il contenuto è sviluppato con Visual Studio 2010.VS2008 dovrebbe funzionare troppo bene.

Server:

  • Installazione di un server Linux con Apache2 e MySQL, ci sono tonnellate di guide su questo.
    • Assicurarsi che MySQL è accessibile dal PC di sviluppo e, facoltativamente, da Internet.Vedi qui per i dettagli: Cause degli Errori di Accesso Negato.
    • Installazione le strutture di tabella di database e aggiungere alcuni contenuti per le prove successive.Nel nostro esempio, si supponga di avere la tabella "persone" con la colonna 'nome'.
  • Dal momento che Silverlight è una tecnologia lato client, si sono praticamente pronta e può ospitare l'applicazione con una semplice pagina HTML.
  • Un servizio web è necessario tra Silverlight e MySQL.Microsoft WCF RIA è un "gusto", ma richiede .NET.Da un lato, si arriva a host ASP.NET4 pagine.Qui è una guida approfondita per l'impostazione: L'impostazione Mono 2.8 con Asp.Net 4.0 e MVC2 su Ubuntu con MySql Appartenenza

Visual Studio:

  • Installare l'ultima versione MySQL Connector/Net e riavviare VS
  • Aggiungi il tuo database MySQL come origine dati
    • Aprire Esplora Server -> Aggiungi connessione dati -> Selezionare "Database MySQL'
    • Riempire le credenziali e il test di connessione

Realizzazione del sito con accesso a MySQL:

Qui è una guida che ho trovato utile: Guida passo passo per WCF RIA abilitato SL4 applicazione con Entity Framework

  • Creare o aprire un progetto Silverlight.
    • La parte server del progetto è di solito denominato " Nomeprogetto.Web'
    • Il lato client del progetto è di solito denominato "Nomeprogetto"
  • Aggiungere 'ADO.NET Entità del Modello di Dati di" server progetto.Questo sarà un modello di struttura del database.
    • Selezionare 'Generate dal database'
    • Scegliere il database MySQL connessione creata
    • Selezionare le tabelle che si desidera accedere
  • Costruisci la tua soluzione prima di procedere.
  • Aggiungere 'di Servizio del Dominio di Classe" per il progetto del server di f.ex.'FooDomain'.Questo renderà l'entità del database disponibili per il lato client Silverlight codice.
    • Nel 'Disponibile DataContext/ObjectContext classi:' seleziona il modello Entity Framework creato nel passaggio precedente.
    • Controllare le entità che si desidera accedere e selezionare "Attiva modifica" ove appropriato
    • Controllare 'Generare le classi associate per i metadati'
  • Costruisci la tua soluzione per generare 'FooDomainContext', sulla base di "FooDomain' nel server del progetto.

Test:

Andiamo a prendere i dati da MySQL in Silverlight.Supponendo che non c'è una tabella denominata "persone" con il nome di colonna 'nome', siamo in grado di associare una casella di riepilogo per visualizzare i nomi delle persone.

Prima di aggiungere una pagina Silverlight, diciamo 'Casa'.In Casa.xaml aggiungere:

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

In Casa.xaml.cs file di aggiungere:

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

Qui diamo per scontato che hai chiamato il tuo dominio servizio 'FooDomain', e questo genera il 'FooDomainContext' classe.

Speriamo che, se tutto è impostato correttamente, verrà visualizzato un elenco di nomi di persona, durante l'esecuzione del tuo progetto Silverlight.

Edit: ASP.NET non è facoltativo, ma necessario per i WCF RIA servizio web utilizzato nel mio esempio.

Avendo DB direttamente le connessioni al server che dal lato client è di solito una cattiva idea.Non so quanto sia facile per decompilare un'applicazione Silverlight, ma direi che è possibile, in qualche modo.Quindi stai praticamente dando via i DB credenziali agli utenti.

È possibile ottenere i dati da MySQL utilizzando Servizi Web.

Procedura dettagliata:

Passaggio 1:Creare Servizi Web

Passaggio 2:Aggiungi Riferimento al Servizio di Silverlight


Passaggio 1:Creare Servizi Web

Aggiungere un nuovo progetto Silverlight.

Add a new Silverlight project

Creare un nuovo Servizio Web.Fare clic destro sul web di progetto > Aggiungi > Nuova Voce

Create a new Web Service

Selezionare "Web Service".

enter image description here

Codice iniziale di un nuovo Servizio 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";
        }
    }
}

In ordine per il Servizio Web in grado di connettersi a MySQL, abbiamo bisogno di aggiungere un riferimento di MySql.Data.DLL il progetto web e aggiungere l'Utilizzo di istruzione e di classe del Servizio Web:

using MySql.Data.MySqlClient; 

HelloWorld() è un primo esempio di metodo creato da Visual Studio.Se si desidera eliminare come non è necessario.Ho intenzione di creare 2 metodo semplice per dimostrare come i Servizi Web sono utilizzati per la comunicazione tra SilverLight e MySQL.

Primo metodo: ExecuteScalar()

Questo metodo è semplice.Ottenere un singolo oggetto da 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;
    }
} 

Secondo metodo: ExecuteNonQuery()

Per SQL singola esecuzione.Esempio di SQL del tipo: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;
    }
}  

Questo è come il Servizio Web sembra che dopo l'aggiunta di due metodi di cui sopra:

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

Si noterà che un attributo di [WebMethod] è aggiunto ai metodi.

Ricostruire il progetto e che il Servizio Web di essere pronto per il passo successivo.

Rebuild the project

Accesso Al Servizio Web Di Autorizzazione

Si prega di notare che, per impostazione predefinita, il Servizio Web di consentire solo quelli Silverlight che è ospitato presso lo stesso dominio con il Servizio Web di accesso.Se l'applicazione Silverlight è ospitato su un altro sito/dominio, Web Servizio di impedire la comunicazione.Dobbiamo, pertanto, configurare l'autorizzazione per il Servizio Web, accessibile da Silverlight, che è ospitato in un dominio diverso.

È necessario creare due file aggiuntivi: clientaccesspolicy.xml e crossdomain.xml.

Questi file va messo nella root del dominio in cui sono ospitati i Servizi Web.

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

Se solo si desidera consentire il Servizio Web, accessibile dal dominio specifico (esempio:www.myanotherwebsite.com), è possibile aggiungere all'interno .Esempio:

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

Per capire di più su questo, si prega di leggere: Rendere Disponibile un Servizio Attraverso i Limiti del Dominio (informazioni in lingua inglese)


Passaggio 2:Aggiungi Riferimento al Servizio di Silverlight

Aggiungere un Riferimento al Servizio di Silverlight.

Add a Service Reference to Silverlight

Digitare l'indirizzo del Web Service e premere [Go].

Esempio di indirizzo: http://www.mywebsite.com/MyCoolWebService.asmx

Modificare lo spazio dei nomi a vostro favore, e premere [OK].

Web Service Browser

Visual Studio analizza il Web Service, eseguire l'associazione dei dati e la creazione di una classe.

Prima di continuare la codifica, ci vediamo quali sono i metodi che possiamo utilizzare nella nuova classe creata.Fare clic destro la nuova classe a e selezionare [Visualizza nel Browser degli Oggetti].

View in Object Browser

La classe che andremo ad utilizzare è WebService1SoapClient (in questo esempio).La denominazione è basato sul nome del Servizio.Se abbiamo il nome il nostro servizio di classe come MyCoolWebService, quindi MyCoolWebServiceSoapClient sarà scelto come nome della classe in Silverlight.Il pannello di destra, due metodi e due eventi sono evidenziati.Quelli sono i metodi utilizzati per chiamare i Servizi Web.

Object of WebService1SoapClient

Consente di creare una semplice applicazione Silverlight con l'aggiunta di un Textbox e due Pulsanti.

In questo esempio, l'utente chiave nella query SQL direttamente nella casella di testo.

Pulsante di [ExecuteScalar] per inviare il codice SQL per il Servizio Web e recuperare i dati.(SELEZIONARE, SPETTACOLO, etc.)

Pulsante di [ExecuteNonQuery] per inviare il codice SQL per Web Service per l'esecuzione solo.(INSERT, UPDATE, DELETE, etc.)

Design a simple SilverLight App

Questo è il codice iniziale dietro di 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)
        {
        }
    }
}

Ora, questi sono ciò che ci accingiamo a fare qui:

  • Dichiarare il servizio come oggetto statico a livello di classe:ServiceReference1.WebService1SoapClient
  • Creare il servizio prestato evento dei due metodi.
  • Chiamare il servizio in caso di clic del pulsante.
  • Visualizza il servizio di risultato: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);
    }
}

Premere il tasto [F5], eseguire e testare l'applicazione Silverlight.

Testing

Testing

Testing

Insieme con la vostra creatività, credo che tu possa fare qualcosa di più di questo per ora Sorridi | :)

Se hai fatto modifiche al Servizio Web, forse è stato aggiunto un nuovo Servizio (nuovi metodi web), è necessario aggiornare il Riferimento al Servizio di Silverlight per ri-associare i Servizi.Si potrebbe desiderare di aggiornare l'indirizzo del Servizio Web, se hai caricato i file su un web hosting.

update the Service Reference

Felice di codifica.

Leggi Di Più:

  1. Post originale - Connessione MySQL Da SilverLight Con i Servizi Web - CodeProject.com (scritto da me)
  2. Accedere a un Servizio Web da un'Applicazione Silverlight
  3. COME:Scrivere un Semplice Servizio Web Utilizzando Visual C# .NET
  4. Come:Costruire un Servizio per il Client Silverlight
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top