Bruno Soares

Fluorine, uma alternativa de Flash Remoting com ASP.NET

sexta-feira, 1 de fevereiro de 2008



Nos tempos em que o Flash ainda era da Macromedia, foi criada a especificação AMF (ActionScript Message Format), para facilitar a comunicação entre o ActionScript e as demais linguagens Server-side (Gateway, mais a diante vamos ver que o que controla a comunicação entre o ActionScript e o ASP.NET é com.TheSilentGroup.Fluorine.FluorineGateway). Temos hoje várias linguagem com alguma biblioteca que implemente AMF como por exemplo o PHP, Java, ColdFusion e também o ASP.NET. Existe uma alternativa de remoting muito boa para quem trabalha com PHP que é o AMFPHP, para quem o conhece será fácil entender o funcionamento do Fluorine. E para quem não o conhece tenho certeza de que vão encontrar muito material sobre ele na Internet.

Hoje em dia já estamos na versão 3 da AMF e a Fluorine também implementa bibliotecas para uso desta versão de AMF.

Vamos ao tutorial.

Nosso primeiro passo será o download do Fluorine no link a seguir: http://fluorine.thesilentgroup.com/fluorine/download.html
Não vou dar detalhes da instalação porque é sempre a mesma coisa de Next, Next e Finish.

Após realizada a instalação do Fluorine, vamos abrir o Visual Studio e criar uma nova aplicação web। File -> New -> Web Site, selecione Fluorine ASP.NET Web Application, como mostrado na figura seguinte:




Sua Solution Explorer deve se parecer com esta imagem:




Abra o arquivo Sample.cs (dentro de App_Code), vamos utiliza-lo em nosso primeiro teste do Fluorine.
Observe que a classe Sample está dentro do namespace www e que possui um método chamado Echo que retorna uma string e precisa de um parâmetro. O método pega a string do parâmetro (text), concatena com "Gateway echo: " e retorna.

using System;
using com.TheSilentGroup.Fluorine;

namespace www
{
[RemotingService("Fluorine sample service")]
public class Sample
{
public Sample() { }

public string Echo(string text)
{
return "Gateway echo: " + text;
}
}
}
Pressione F5 para rodar a aplicação, clique sob o arquivo Console.aspx, note que você foi redirecionado para Fluorine.aspx, o Service Browser do Fluorine, deve se parecer com a imagem seguinte:




Você pode clicar no link “• www.Sample” para ver a especificação dos métodos e também obter um exemplo de código em ActionScript 1 e 2 que já roda os métodos da classes Sample.

Para dizer ao Fluorine que você quer que determinada classe seja acessada por Flash é só você importar “com.TheSilentGroup.Fluorine” (using com.TheSilentGroup.Fluorine;), e colocar o atributo “[RemotingService("Descrição")]” na classe. Fique atento que feito isso, o Fluorine só vai mostrar no Service Browser os métodos publicos da classe, é claro que sem contar o construtor.
Veja como o Service Browser detalha os métodos das classes e já deixa um exemplo de Script para utilizarmos no Flash:




Visto que o Service Browser já gera o código correspondente em ActionScript 1 e 2, vamos deixar o nosso tutorial mais interessante e mostrar uma forma de fazer as devidas chamadas em ActionScript 3.0. Abra o Flash, e cria um arquivo novo, no primeiro frame do Flash insira o código a seguir:

import flash.net.*;

function onResult(responds : Object) : void {
trace ("onResult: " + responds)
}

function onFault(responds : Object) : void {
trace("fault " + responds.toString());
}

var responder : Responder = new Responder(onResult, onFault);

var gateway : NetConnection = new NetConnection();
gateway.connect("http://localhost:2471/www/Gateway.aspx");
gateway.call("www.Sample.Echo", responder, "Primeiro teste do Fluorine!");


Fique atento quanto ao endereço do Gateway.aspx, pois no nosso exemplo estou utilizando o endereço que o próprio Visual Studio cria quando rodamos a aplicação, por isto que temos esta portar “maluca” (http://localhost:2471).

Depois que você rodar a aplicação no Visual Studio, pegar o endereço gerado por ele, colar o endereço dentro de ‘gateway.connect("ENDEREÇO");’ e exportar o flash, você deve receber a mensagem “onResult: Gateway echo: Primeiro teste do Fluorine!”. Se foi exatamente isso que aconteceu, uueebá! Você acabou de fazer o seu primeiro teste de Flash Remoting com ASP.NET utilizando Fluorine!!! Fácil não?

Agora vamos entender cada linha de código desse nosso ActionScript 3.0:
1ª – Importamos todas as classes que nos ajudam a efetuar conexões do Flash com o “Mundo Externo”.
3ª à 9ª – Criamos as funções de callback que vão receber as respostas da nossa requisição.
11ª – Criamos um Responder para armazenar as nossas funções de respostas (onResult e onFault).
13ª – Criamos o nosso gateway, responsável pela comunicação com o Fluorine.
14ª – Conectamos o nosso gateway ao Serviço do Fluorine.
15ª – Efetuamos a chamada para o método Echo da classe Sample que se encontra no namespace www, passamos como segundo parâmetro o Responder (criado na linha 11) e como 3º parâmetro passamos o uma string, pois o método Echo precisa de uma string para funcionar.

É isso ai pessoal, espero ter ajudado aqueles que precisam da combinação Flash + ASP.NET, como foi o meu caso, pois já conhecia o AMFPHP mas no meu trabalho atual utilizamos ASP.NET.

No próximo post vou mostrar como transferir um bitmap do Flash para o Fluorine, agora a coisa vai ficar boa :)

Link para download do projeto:
http://blog.bsoares.com.br/downloads/Fluorine.NET/20080202_Projeto.zip

Links relacionados:
• Fluorine: http://fluorine.thesilentgroup.com/fluorine
• Fluorine download: http://fluorine.thesilentgroup.com/fluorine/download.html
• Flash Remoting: http://www.adobe.com/devnet/flashremoting/
• AMF3: http://osflash.org/documentation/amf3
• AMFPHP: http://www.amfphp.org
• Gateway: http://pt.wikipedia.org/wiki/Gateway

Marcadores: , , , , , ,

11 Comentários:

Às 24 de junho de 2008 às 16:54 , Blogger CR2 disse...

Bruno, consegui com sucesso valew a explicação, só mais uma coisa que ninguém soube me explicar ....

o Fluorine me gerou a seguinte classe

/////////////////////////////////////

import mx.remoting.Service;
import mx.rpc.RelayResponder;
import mx.rpc.FaultEvent;
import mx.rpc.ResultEvent;
import mx.remoting.PendingCall;
import mx.remoting.RecordSet;
import mx.remoting.DataGlue;
import mx.utils.Delegate;
import mx.remoting.debug.NetDebug;
import mx.data.binding.ObjectDumper;



class Remote.Classes
{
//Change the gateway URL as needed
private var gatewayUrl:String = "http://localhost:1259/Interface/Gateway.aspx";
private var service:Service;

function Classes()
{
NetDebug.initialize();
this.service = new Service(this.gatewayUrl, null, "Remote.Classes", null, null);

}

function nome(text)
{
var pc:PendingCall = service.nome(text);
pc.responder = new RelayResponder(this, "handlenome", "handleRemotingError");
}

function handlenome(re:ResultEvent)
{
//Implement custom callback code
trace(ObjectDumper.toString(re.result));
}


function dados()
{
var pc:PendingCall = service.dados();
pc.responder = new RelayResponder(this, "handledados", "handleRemotingError");
}

function handledados(re:ResultEvent)
{
//Implement custom callback code
trace(ObjectDumper.toString(re.result));
}


function handleRemotingError( fault:FaultEvent ):Void
{
NetDebug.trace({level:"None", message:"Error: " + fault.fault.faultstring });
trace(ObjectDumper.toString(fault.fault));
}
}

////////////////////////////////////

como consumir os dados fora dessa classe, sendo que estou usando import ?

desde já agradeço ....

Abrç

 
Às 24 de junho de 2008 às 19:21 , Blogger Bruno Soares disse...

Então, o fato de vc importar não quer dizer nada, pois vc pode importar estas mesmas classes em outra classe... e utilizar de outra forma. Se vc já tem uma classe pra controlar um form de contatos por exemplo, vc só precisa importar esses mesmas classes e executar o mesmo procedimento para chamar o metodo que envia o contato.

Abs.

 
Às 25 de novembro de 2008 às 15:31 , Blogger CR2 disse...

E ae Bruno, to com um problemão no fluorineFx, vc sabe o motivo de uma string (só que com números ex : 4444444444555555555555555 )
me retorna isso ???????????? obs ( exemplo do fluorinefx )

“Gateway echo: 4,44444444455556E+24″

 
Às 25 de novembro de 2008 às 16:39 , Blogger Bruno Soares disse...

Então, fiquei meio intrigado agora e até fiz um teste para não falar bobagens.

public string teste(){
return "4444444444555555555555555";
}

Este método ai funcionou normalmente.
Verifique no seu código se em algum momento uma variável não da overflow.

Pode até estar vindo do banco de dados assim.

 
Às 26 de novembro de 2008 às 05:47 , Blogger CR2 disse...

na verdade bruno, não fiz ligação com banco de dados para que isso ocorra ... no exemplo do fluorine mesmo apresenta isso ... o pior é que estou fazendo comércio eletrônico e penei p/ descobrir que isso estava ocorrendo, pois o nº de cartão tem 16 digitos

 
Às 26 de novembro de 2008 às 05:48 , Blogger CR2 disse...

estou tendo que colocar uma string (ex : #) para evitar isso, mas é uma solução meio estranha não acha ?

 
Às 26 de novembro de 2008 às 06:48 , Blogger Bruno Soares disse...

CR2, estranho mesmo.
Tenta instalar o Charles (http://www.charlesproxy.com/) e monitorar o request no server, para ter certeza de onte esta ocorrendo a conversao do valor para inteiro. Pois pode ser no flash o erro, você esta tratando o número do cartão como inteiro ou string no flash?

 
Às 26 de novembro de 2008 às 06:55 , Blogger CR2 disse...

vou instalar . Na verdade Bruno no flash tmb é string ..... vou ver o que esta acontecendo e te posto depois

 
Às 26 de novembro de 2008 às 07:06 , Blogger CR2 disse...

bruno, só para exemplificar o ocorrido .. publiquei nesse link

http://www.betaweb.infovs.com.br/beta11/Fluorine.aspx

digite por exemplo : 5555444433339999

 
Às 26 de novembro de 2008 às 08:16 , Blogger Bruno Soares disse...

Ta dando problema no Flash tbm? pq se você pelo console do fluorine passar "5555444433339999" com as aspas, funciona normalmente. Isso ai rola pq o console permite que você envie parametros em formato JSON, e acontece coisas do tipo no WebORB, e AMFPHP tbm. por exemplo ja aconteceu comigo de tentar passar uma data e dar pau, dai vc envia a data entre aspas e funciona...
esse "problema" não deve acontecer quando vc usa direto no flash, pois só o console que faz algumas conversões...

Acho q é isso ai hem, agora teste no flash.

 
Às 26 de novembro de 2008 às 09:07 , Blogger CR2 disse...

HUmmm ... certo, vou testar direto do flash e ver o que acontece, valew Bruno

 

Postar um comentário

Assinar Postar comentários [Atom]

<< Página inicial