Como ter o silverlight obter seus dados de MySQL
-
01-07-2019 - |
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?
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:
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.
Criar um novo Serviço Web.Clique direito sobre o projeto da web > Adicionar - > Novo Item
Selecione "Web Service".
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.
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.
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].
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].
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.
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.)
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.
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.
Codificação feliz.
Leia Mais: