Pergunta

Escrevi um pequeno hello world teste de aplicação em Silverlight que eu quero hospedar em um Linux/Apache2 servidor.Eu quero que os dados vêm do MySQL (ou algum outro compatível com linux db) para que eu possa databind para as coisas na db.

Eu consegui fazê-lo funcionar usando o 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();
}

Isso funciona bem se eu der o publicado ClickOnce aplicativo cheio de confiança (ou pelo menos SocketPermission) e executá-lo localmente.

Eu quero que este seja executado no servidor e eu não posso fazê-lo funcionar, sempre terminando com a permissão de exceção (SocketPermission não é permitido).

O banco de dados está hospedado no mesmo servidor em que o aplicativo do silverlight se isso faz alguma diferença.

EDITAR Ok, agora eu entendo por que é uma má idéia ter db credenciais no cliente app (obviamente).Como as pessoas fazem isso, então?Como você segura o proxy de serviço da web para que retransmite os dados para e a partir do cliente/db de forma segura?Há exemplos na web?

Certamente, eu não posso ser a primeira pessoa que gostaria de usar um banco de dados para a alimentação de um aplicativo do silverlight?

Foi útil?

Solução

A maneira mais fácil de fazer o que quiser (depois de ter lido através de suas edições agora :)) será para expor os serviços que podem ser consumidos. O padrão que a Microsoft está empurrando realmente agora é expor serviços WCF, mas a verdade é que o seu cliente Silverlight pode usar o WCF para consumir uma grande quantidade de diferentes tipos de serviços.

O que pode ser mais fácil para você fazer agora seria a utilização de um serviço .NET em um servidor web ou talvez um serviço PHP REST, e aponte seu aplicativo Silverlight naquele serviço. Ao fazer isso, você está protegendo seu banco de dados não só de pessoas bisbilhotando através dele, mas o mais importante, você está restringindo o que as pessoas podem fazer para seu banco de dados. Se os dados é suposto ser só de leitura, e contrato do seu serviço só permite operações de leitura, você está pronto. Alternativamente, o serviço pode negociar sessões com credenciais, de novo, configurar por meio do WCF.

WCF pode ser um cliente-only, somente de servidor, ou plataforma conector de cliente-servidor. O que você escolher vai afetar o código que você escreve, mas tudo vai ser independente do seu banco de dados. Seu código pode ser estruturado de tal forma que é um mapeamento um-para-um para a sua mesa de banco de dados, ou ele pode ser muito mais abstrato (você pode configurar classes que representam visões lógicas completo se você escolher).

Outras dicas

Enquanto a resposta "oficial" é usar WCF para empurrar um serviço para Silverlight, eu tipo de figura que qualquer pessoa usando o MySQL, provavelmente, não estar usando uma solução completa ASP.NET. Minha solução foi construir um webservice PHP (como Rob sugerido) para interagir com o banco de dados MySQL e ter o acesso Silverlight-lo de uma maneira RESTful.

Aqui está começando de um tutorial de três partes para usar o Silverlight para acessar um banco de dados MySQL através de um serviço web PHP:

PHP , MySQL e Silverlight: The Complete Tutorial

Silverlight não tem qualquer capacidade de servidores de banco de dados diretamente de acesso. O que você pode fazer é expor suas operações de banco de dados através de serviços Web (ASMX ou WCF, mesmo non-.NET!) E usar o Silverlight para acessar esses serviços.

Eu só tenho este trabalho; local ASP.NET4 com conteúdo Silverlight4 no servidor Linux Ubuntu 10 / Apache2. O conteúdo é desenvolvido usando o Visual Studio 2010. VS2008 deve funcionar bem também.

Servidor:

  • Configuração de um servidor Linux com Apache2 e MySQL, há toneladas de guias sobre este assunto.
    • Certifique-se de MySQL é acessível a partir do PC desenvolvimento e, opcionalmente, a partir da Internet. Veja aqui para mais detalhes: Causas dos Erros de Accesso Negado .
    • Configuração da tabela estruturas de banco de dados e adicionar algum conteúdo para testar mais tarde. No nosso exemplo, vamos supor que você tem a tabela 'pessoas' com o 'nome' da coluna.
  • Uma vez que o Silverlight é uma tecnologia do lado do cliente você é muito bonita bom-to-go e pode hospedar o aplicativo com uma página HTML simples.
  • É necessário
  • Um serviço de web entre Silverlight e MySQL. WCF RIA da Microsoft é um sabor, mas requer .NET. No lado mais o, você começa a páginas ASP.NET4 hospedeiras também. Aqui está um guia completo para configurá-lo: Configuração de Mono 2.8 com Asp.Net 4.0 e MVC2 no Ubuntu com MySql Membership

Visual Studio:

  • Instale mais recente MySQL Connector / Net e reiniciar VS
  • Adicione seu banco de dados MySQL como fonte de dados
    • Open Server Explorer -> Adicionar conexão de dados -> Select 'MySQL banco de dados'
    • Preencha credenciais e conexão de teste

Configuração do site com acesso MySQL:

Aqui está um guia que eu encontrei útil: Step By Step Guide to WCF RIA habilitado aplicativo SL4 com Entity Framework

  • Criar ou abrir um projeto Silverlight.
    • O projeto do lado do servidor é normalmente chamado 'ProjectName.Web'
    • O projeto do lado do cliente é normalmente chamado 'ProjectName'
  • Adicionar 'ADO.NET Entity Data Model' para o projeto de servidor. Este será um modelo de sua estrutura de banco de dados.
    • Selecione 'Gerar a partir do banco de dados'
    • Escolha a conexão de banco de dados MySQL você criou
    • Selecione as tabelas que você deseja acessar
  • Construa a sua solução agora antes de prosseguir.
  • Adicionar 'Domain Classe de Serviço' para o projeto de servidor, f.ex. 'FooDomain'. Isso fará com que as entidades de banco de dados disponível para o código Silverlight do lado do cliente.
    • Em 'DataContext disponível / ObjectContext classes:'. Selecionar o modelo Entity Framework você criou no passo anterior
    • Verifique as entidades que você deseja acessar e verificar 'permitir a edição' quando apropriado
    • Verifique 'Gerar classes associadas para metadados'
  • Construa a sua solução novamente para gerar 'FooDomainContext', baseado em 'FooDomain' em projeto de servidor.

Testing:

Vamos dados get a partir do MySQL em Silverlight. Assumindo que há uma tabela chamada 'pessoas' com nome da coluna 'nome', podemos vincular uma caixa de lista para mostrar os nomes das pessoas.

Primeiro adicione uma página Silverlight, vamos dizer 'Home'. Em Home.xaml add:

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

Em Home.xaml.cs arquivo add:

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

Aqui nós assumimos que você nomeou seu serviço de domínio 'FooDomain', e isso iria gerar classe 'FooDomainContext' usado.

Esperemos que, se tudo está configurado corretamente, você vai ver agora uma lista de nomes de pessoas ao executar seu projeto Silverlight.

Editar:. ASP.NET não é opcional, mas necessário para o serviço web WCF RIA usado no meu exemplo

Tendo conexões DB diretamente ao servidor do lado do cliente é geralmente uma má idéia. Eu não sei como é fácil para decompor um aplicativo Silverlight, mas eu acho que é possível, de alguma forma. Então você está basicamente dando suas credenciais de banco de dados para os usuários.

Você pode obter os dados de MySQL usando Serviços da Web.

Passo a passo:

Passo 1:Criar Serviços Da Web

Passo 2:Adicionar Referência de Serviço para o Silverlight


Passo 1:Criar Serviços Da Web

Adicionar um novo projeto Silverlight.

Add a new Silverlight project

Criar um novo Serviço Web.Clique direito sobre o projeto da web > Adicionar - > Novo Item

Create a new Web Service

Selecione "Web Service".

enter image description here

Código inicial de um novo Serviço da 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";
        }
    }
}

Em ordem para o Serviço da Web capaz de se conectar ao MySQL, é necessário adicionar uma referência de MySql.Data.DLL para o projeto web e adicionar a instrução using no topo da classe de Serviço da Web:

using MySql.Data.MySqlClient; 

HelloWorld() é uma amostra inicial método criado pelo Visual Studio.Você pode querer excluí-la, pois não é necessário.Eu vou criar 2 método simples para demonstrar como os Web Services são utilizados para a comunicação entre o SilverLight e o MySQL.

Primeiro método: ExecuteScalar()

Este método é simples.Obter um único objeto a partir do 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;
    }
} 

Segundo método: ExecuteNonQuery()

Para uma única execução de SQL.Exemplo de tipo 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;
    }
}  

Esta é a forma como o Serviço da Web parece que depois de adicionar os dois métodos acima:

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

Você irá notar que um atributo de [WebMethod] é adicionado aos métodos.

Reconstrua o projecto e permitir que o Serviço Web de estar pronto para o próximo passo.

Rebuild the project

Serviço Web De Permissão De Acesso

Por favor, note que, por padrão, o Serviço da Web permitir apenas aqueles Silverlight que está hospedado no mesmo domínio com o Serviço da Web para acessar.Se o aplicativo do Silverlight está hospedado em outro site/domínio, Web Service irá negar a comunicação.Por isso temos que configurar a permissão para o Serviço da Web para ser acessado pelo Silverlight, que está hospedado em outro domínio.

Você tem que criar dois arquivos adicionais: clientaccesspolicy.xml e crossdomain.xml.

Esses arquivos tem que ser colocado na raiz do domínio onde os Serviços Web são hospedados.

Exemplo: 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 você quiser apenas para permitir que o Serviço da Web para ser acessado pelo domínio específico (exemplo:www.myanotherwebsite.com), você pode adicioná-lo dentro .Exemplo:

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

Para entender mais sobre isso, por favor leia: Fazendo um Serviço Disponível Através de Limites de Domínio (MSDN)


Passo 2:Adicionar Referência de Serviço para o Silverlight

Adicionar uma Referência de Serviço para o Silverlight.

Add a Service Reference to Silverlight

Escreva o endereço do Web Service e prima [Go].

Exemplo de endereço: http://www.mywebsite.com/MyCoolWebService.asmx

Alterar o espaço de nomes a seu favor, e prima [OK].

Web Service Browser

O Visual Studio irá analisar o Serviço da Web, fazer a ligação de dados e criar uma classe.

Antes de continuar codificação, vamos ver o que os métodos que podemos usar no novo criado de classe.Clique com o botão direito a nova classe e seleccione [Ver em Object Browser].

View in Object Browser

A classe que vamos usar é WebService1SoapClient (neste exemplo).O nome é baseado no nome do Serviço.Se temos o nome da nossa classe de serviço como MyCoolWebService, em seguida, MyCoolWebServiceSoapClient será escolhido como o nome da classe no Silverlight.No painel da direita, os dois métodos e dois eventos são destacadas.Esses são os métodos utilizados para chamada de Serviços da Web.

Object of WebService1SoapClient

Vamos criar um simples aplicativo do Silverlight adicionando uma caixa de Texto e dois Botões.

Neste exemplo, o usuário chave na consulta SQL diretamente para a caixa de Texto.

Botão de [ExecuteScalar] irá enviar o SQL para o Serviço da Web e recuperar dados.(SELECT, SHOW, etc.)

Botão de [ExecuteNonQuery] irá enviar o SQL para o Serviço da Web para a execução.(INSERT, UPDATE, DELETE, etc.)

Design a simple SilverLight App

Este é o código inicial por trás da 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)
        {
        }
    }
}

Agora, estes são o que nós vamos fazer aqui:

  • Declarar o serviço como objeto estático ao nível de classe:ServiceReference1.WebService1SoapClient
  • Criar o serviço realizado evento de dois métodos.
  • Chamar o serviço no evento de clique de botão.
  • Apresentar o resultado do serviço: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);
    }
}

Pressione a tecla [F5], executar e testar o aplicativo do Silverlight.

Testing

Testing

Testing

Juntamente com a sua criatividade, eu acredito que você pode fazer algo mais do que isso, por agora, Sorriso | :)

Se você tiver feito alterações para o Serviço da Web, talvez você adicionou novos Serviços novos métodos da web), você tem que atualizar o Serviço de Referência em Silverlight para re-ligar os Serviços.Você pode querer atualizar o endereço de Serviço Web, se você fez o upload de arquivos para um outro web hosting.

update the Service Reference

Codificação feliz.

Leia Mais:

  1. Post Original - Conexão com o MySQL a Partir do SilverLight Com Web Services - CodeProject.com (escrito por mim)
  2. Aceder a um Web Service a partir de um Aplicativo do Silverlight
  3. COMO:Escrever um Serviço Web Simples Utilizando o Visual C# .NET
  4. Como:Criar um Serviço para o Silverlight Clientes
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top