ago 09 2008

Integrando Adobe Flex - FluorineFx - C#.net (Parte 2/2)

Categoria: C#.net, Flex, FluorineFxVinícius Sandim @ 14:47

[ Assista agora a palestra sobre este post realizada durante a Flex Mania 2009 ]

Olá pessoal, hoje finalmente vou postar a segunda parte do artigo, neste post vamos utilizar os nossos métodos Insere e Lista, criados anteriormente no asp.net.

Então vamos lá…

1 - Crie um projeto no Flex do tipo Flex Project e nomeie como IntegracaoFlex.

2 - Crie uma pasta chamada mapeamento dentro da pasta src do projeto. (Botão direito do mouse sobre a pasta src New>Folder). O Flex interpreta esta pasta como um package, é um conceito muito parecido com o das Namespaces no Visual Studio. Dentro desta pasta vamos mapear as nossas classes criadas no asp.net, como no nosso exemplo temos uma classe só, a Pessoa, vamos implementa-la.

3 - Crie uma nova classe dentro de nossa pasta/package mapeamento, dê o nome de Pessoa, este nome deve ser idêntico ao da classe criada anteriormente no asp.net. (Botão direito sobre a pasta mapeamento New>ActionScript Class), preencha apenas o campo Name com o valor Pessoa.

4 - Agora vamos implementar apenas os atributos da nossa classe criada no asp.net, portanto deixe a classe pessoa da seguinte maneira:

package mapeamento
{
    [RemoteClass(alias="IntegracaoFlex.Pessoa")]
    public class Pessoa
    {
        private var _id_Pessoa:int;        
        public function get Id_Pessoa():int { return this._id_Pessoa; }        
        public function set Id_Pessoa(valor:int):void { this._id_Pessoa = valor; }
        
        private var _nome:String;        
        public function get Nome():String { return this._nome; }        
        public function set Nome(valor:String):void { this._nome = valor; }
        
        private var _telefone:String;
        public function get Telefone():String { return this._telefone; }        
        public function set Telefone(valor:String):void { this._telefone = valor; }        
        
        public function Pessoa()
        {
            
        }        
    }
}

Desta forma temos a classe Pessoa com os atibutos Id_Pessoa, Nome e Telefone, note que o conceito para o desenvolvimento dos nossos atributos é muito parecido com a do C#.net, ou seja, temos as palavras reservadas get e set para que o complilador entenda que determinada function é um atributo da classe, e não uma function convencional.

Assim como no nome da classe, o nome dos atributos também devem ser idênticos no C#.net e no ActionScript, inclusive os tipos, para que o fluorine fa’xa a serialização C#.net>ActionScript corretamente. Veja mais na documentação oficial do fluorine a tabela completa de serialização.

5 - Agora vamos realmente fazer o mapeamento dos objetos ActionScript>C#.net, para isso, crie um arquivo XML dentro da pasta src do nosso projeto e dê o nome de services-config.xml (Botão direito do mouse sobre a pasta src New>File). Preencha o campo File name com o valor services-config.xml. Deixe o arquivo da seguinte maneira:

<?xml version="1.0" encoding="UTF-8"?>
<services-config>
 
    <services> 
 
        <service id="remoting-service" 
            class="flex.messaging.services.RemotingService" 
            messageTypes="flex.messaging.messages.RemotingMessage">
 
            <destination id="fluorine">
            
                <channels> 
                    <channel ref="my-amf"/>
                </channels> 
                
                <properties> 
                    <source>*</source> 
                </properties> 
                
            </destination> 
            
        </service> 
        
    </services> 
 
    <channels> 
    
        <channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
            <endpoint uri="http://localhost:3024/Negocio/Gateway.aspx" 
                class="flex.messaging.endpoints.AMFEndpoint"/>
        </channel-definition>
        
    </channels> 
    
</services-config>

Agora execute o seu website criado no VisualStudio anteriormente, ele deverá exibir a lista de arquivos encontrados, isso acontece por que não temos uma página Default.aspx, clique sobre a página Gateway.aspx no navegador, ele abrirá uma pagina em branco, pois não temos nada de interface na Gateway.aspx, o que precisamos agora é do endereço dessa página, copie na barra de endereços do  navegador, deve ser algo parecido com (http://localhost:3024/Negocio/Gateway.aspx), o que vai alterar é apenas o número da porta gerado pelo servidor web do VisualStudio, e coloque o endereço na tag uri do atributo endpoint, para este endereço de sua página Gateway no arquivo XML criado agora.

6 - Agora para finalizarmos o mapeamento, precisamos informar ao compilador do Flex que a configuração de serviços remotos que utilizamos em nosso projeto é o arquivo services-config.xlm, para isso, vá até o Flex Navigator, clique com o botão direito do mouse sobre o projeto IntegracaoFlex>Properties, ele abrirá a janela de propriedades de seu projeto, vá até o menu FlexCompiler e deixe o campo Additional compiler arguments com o seguinte valor:

-locale en_US -services services-config.xml

7 - Pronto, o nosso projeto está configurado e vai enxergar a nossa classe no asp.net, agora vamos testar.

8 - Abra o arquivo principal de nosso projeto, o IntegracaoFlex.mxml e adicione uma tag <mx:Script></mx:Script>.

Dentro da tag importe os seguintes packages:

import mx.collections.ArrayCollection;
import mx.rpc.remoting.mxml.RemoteObject;
import mx.rpc.events.ResultEvent;
import mx.rpc.events.FaultEvent;            
import mx.controls.Alert;            
import mapeamento.Pessoa;

Logo abaixo, crie duas functions:

/**
 * Prepara um objeto remoto para executar um método no asp.net.
**/
private function preparaRemoteObj(fncFalha:Function, fncOk:Function = null):RemoteObject{
    //Instancia um objeto remoto pegando as configurações do nosso arquivo services-config.xml
    var remoteObj:RemoteObject = new RemoteObject("fluorine"); //<destination id="fluorine">
    remoteObj.source = "IntegracaoFlex.Pessoa"; // Namespace.NomeDaClasse no ASP.net
    remoteObj.showBusyCursor = true; // Exibe o relogio no lugar do cursor durante a requisição
    
    //Adiciona o evento falha na lista de eventos do ojeto remoto
    remoteObj.addEventListener(FaultEvent.FAULT, fncFalha); 
    
    //Verifica se é null porque nem sempre um método vai retornar algum valor.
    if (fncOk != null)  
        //Adiciona a funcao passada como parametro neste método,
        //ela é responsável por tratar o retorno do método asp.net
        remoteObj.addEventListener(ResultEvent.RESULT, fncOk);  
                                                               
    
    return remoteObj; //retorna o objeto remoto configurado.
}
 
/**
 * Tratamento de erro do método executado no asp.net.
**/
private function rstFalha(evt:FaultEvent):void{
    Alert.show("Ocorreu o seguinte erro ao tentar executar o método:\n" + 
    evt.fault.message, "Erro");
}

A function preparaRemoteObj instancia um objeto do tipo RemoteObject e o configura para executar os métodos do asp.net. (vide comentários)

A function rstFalha trata um possível erro durante a chamada do método asp.net.

TESTANDO O MÉTODO INSERE

9 - Como vocês devem ter visto, por enquanto não executamos nenhum método do asp.net ainda, vamos fazer isto agora. Primeiramente vamos testar o método Insere criado anteriormente chamando-o em um evento click de um button, portanto adicione 3 componentes Label, 3 componentes TextInput e 1 componente Button. Renomeie os componentes da seguinte forma:

TextInputs: txtId_Pessoa, txtNome, txtTelefone

Button: btnInserir

10 - Agora vamos criar mais duas functions dentro de nossa tag <mx:Script></mx:Script>:

/**
 * Tratamento do retorno do método Insere executado no asp.net.
**/
private function rstSucessoInsere(evt:ResultEvent):void{
    if (evt.result != null){
        Alert.show("Método executado com sucesso!\n\n" + 
        (evt.result as String), "Ok");
    }
}
 
/**
 * Evento click do botão Inserir.
**/
private function btnInserir_click(evt:MouseEvent):void{
    if (evt.type == MouseEvent.CLICK){
        
        //Configura a Pessoa
        var pessoa:Pessoa = new Pessoa;
        pessoa.Id_Pessoa = int(txtId_Pessoa.text);
        pessoa.Nome = txtNome.text;
        pessoa.Telefone = txtTelefone.text;
        
        //Executa o método no asp.net
        var remoteObj:RemoteObject = preparaRemoteObj(rstFalha, rstSucessoInsere);                    
        remoteObj.getOperation("Insere").send(pessoa);
    }
}

11 - Agora adicione a tag click="btnInserir_click(event);" no button btnInserir, ele ficará da seguinte forma:

<mx:Button x="167" y="96" 
    label="Inserir" 
    id="btnInserir" 
    click="btnInserir_click(event);"/>

12 - Para testarmos a aplicação, primeiramente execute o website no visual studio, depois compile o projeto no flex. O navegador será aberto, preencha os campos e clique sobre o botão Inserir. Vocé deverá ver uma mensagem na tela com dos dados do cliente inserido. Caso ocorreu algum erro, verifique se todos os passos foram feitos corretamente.

TESTANDO O MÉTODO LISTA

13 - Finalmente vamos testar o nosso método Lista que retorna um List<Pessoa> do asp.net. Para isso adicione 1 componente DataGrid e 1 Componente Button. Renomeie os componentes da seguinte forma:

DataGrid: grdPessoas

Button: btnLista

14 - Edite as colunas do DataGrid deixando-as da seguinte forma:

<mx:DataGrid y="42" width="489" right="10" id="grdPessoas" height="200">
    <mx:columns>
        <mx:DataGridColumn headerText="Id" dataField="Id_Pessoa" width="20"/>
        <mx:DataGridColumn headerText="Nome" dataField="Nome" width="40"/>
        <mx:DataGridColumn headerText="Telefone" dataField="Telefone" width="40"/>
    </mx:columns>
</mx:DataGrid>

Note que o atributo dataField deve ser idêntico ao atributo da classe Pessoa que será retornado.

15 - Agora vamos criar duas functions para a execução do evento, uma é para o click do botao btnLista, e outra para tratar  retorno do método:
 
/**
 * Tratamento do retorno do método Lista executado no asp.net.
**/
private function rstSucessoLista(evt:ResultEvent):void{
    if (evt.result != null){
        grdPessoas.dataProvider = (evt.result as ArrayCollection);
    }
}
 
/**
 * Evento click do botao Lista
**/
private function btnListar_click(evt:MouseEvent):void{
    if (evt.type == MouseEvent.CLICK){
        
        //Executa o método no asp.net
        var remoteObj:RemoteObject = preparaRemoteObj(rstFalha, rstSucessoLista);                    
        remoteObj.getOperation("Lista").send();
    }
}

 
16 - Finalmente adicionamos a tag click no botao btnLista assim como foi feito no btnInserir, deixando-o da seguibte forma:
 
<mx:Button y="12" right="10"
    label="Listar"  
    id="btnListar" 
    click="btnListar_click(event);"/>

 
17 - Para testar, caso a aplicação web não esteja rodando, execute-a no VisualStudio, depois compile o Flex para roda-la. Clique sobre o botão Listar, note que o grid será populado com os dados que inserimos na lista do asp.net.
Bom pessoal, é isso, um tutorial básico para integração do flex com o .net, executando métodos que esperam parâmetros complexos, e retornam lista. Espero ter ajudado, qualquer dúvida é só deixar um comentário.
 
Até a próxima.

34 Responses to “Integrando Adobe Flex - FluorineFx - C#.net (Parte 2/2)”

  1. Wilson says:

    Cara, faço parte do grupo CSharp-Br e fiquei surpreso com a qualidade de seu tutorial.
    Ainda não executei os passos mais desde já lhe dou os parabens!
    Conheço Flex da verssão 2.0, sei que no primeiro mundo ele é amplamente utilizado e aqui
    no brasil é menos conhecido. Parabens, copiar é facil, ser criativo é o verdadeiro desafio.

  2. Vinícius Sandim says:

    Wilson, são comentários como esse que me motiva a escrever artigos, compartinhando um pouco de conhecimento, pois tudo que sei hoje sobre Flex, também foi pesquisando em blogs, fóruns, listas de discussões, e no dia-a-dia aqui da empresa.

    Sou novato ainda nesta área, mas é bom saber que estou conseguindo ajudar um pouco.

    Obrigado!! =D

  3. Vinicius Antonio Gonçalves says:

    Boa tarde Vinicius!!!
    Otimo tutorial!!!
    Gostaria d uma sugetão de metodo para implementar varias classes c#.Net dentro do Adobe flex

  4. Vinícius Sandim says:

    Então Vinícius, o conceito é o mesmo, mas recomendo vc criar uma classe que herda a classe RemoteObject para que você use sempre ela, implementa nela um método parecido com o preparaRemoteObj e use sempre ela em todas as suas telas, para executar os métodos asp.net

    Agora já o mapeamento das classes não é necessário, mas é recomendável da forma como exemplifiquei, ou seja, reescrever todas as suas classes do seu projeto asp.net apenas com os atributos no flex, para a serialização.

    Bom é isso.

  5. Júnior Formagio says:

    Boa tarde Vinícios, tudo ok?!
    Parabéns por teu tutorial! Muito bom!
    Cara, estou com dúvidas e problemas na hora de transferir um List de classes VOs para o Flex. Estes VOs, assim como no teu exmeplo, possuem um correspondente idêntico em ambos os lados (C#/Flex). Gostaria de saber como que faço para que o Flex entenda q o List q estou enviando corresponde a um objeto (Array ou ArrayColection por exemplo) com vários objetos VO do Flex.
    Muito grato rapaz!
    [ ]s

  6. Vinícius Sandim says:

    Então Júnior, me fala mais sobre o seu método ASP.net, você retorna o que nele?

    No tutorial uso um List , já tentou fazer usando assim?

  7. Roberto Tengan says:

    Boa Tarde Vinicius estou tentando seguir o seu tutorial ], porém não consigo executar ele e sempre me passa o seguinte erro:

    Ocorreu o seguinte erro ao tentar executar o método:
    faultCode:InvokeFailed faultString:’[MessagingError message='Destination 'fluorine' either does not exist or the destination has no channels defined (and the application does not define any default channels.)']‘ faultDetail:’Couldn’t establish a connection to ‘fluorine”

    Pelo jeito parece que ele não consegue invocar os métodos ASP.net, porém fiz e refiz as configurações corretamente e o erro continua.

  8. Vinícius Sandim says:

    Boa tarde Roberto, é isso mesmo, o Flex não está enxergando os métodos ASP.net.

    Veja se você fex todas essas configurações:
    * No Flex>Properties… do projeto, você colocou o services-config.xml?? (Passo 6 da Parte 2)
    * Colocou a tag [RemotingService] na classe do ASP.net. (Passo 12 da Parte1)
    * Colocou a tag [RemoteClass(alias="IntegracaoFlex.Pessoa")] na classe do Flex. (Passo 4 da Parte 2)

    Dê uma olhada com calma, você deve ter esquecido algo. Qualquer coisa baixe o Source do projeto, está disponível neste link:

    http://www.viniciussandim.com/downloads/IntegracaoFlex.rar

  9. Roberto Tengan says:

    Bom dia Vinícius, O último item eu coloquei errado a taga estava desse jeito[RemoteClass(alias="IntegracaoFlex.pessoa")], mas mesmo assim gera o mesmo erro, baixei o fonte e darei uma olhada linha a linha. O Visual Studio que estou usando é o 2008, será que tem algo nisso????

  10. Vinícius Sandim says:

    Não tem problema nenhum, funciona também no Visual Studio 2008, mas nele você deve usar a biblioteca referente ao framework 3.5 do FluorineFx, e não a do 2.0,como mostra o tutorial.
    Se você não alterou o caminho na instalação, ela deveá estar em C:\Program Files\FluorineFx\Bin\net\3.5.

  11. Roberto Tengan says:

    Desde o inicio fiz essas referências para o 3.5.
    Estou sem idéia do que possa ser.

  12. Roberto Tengan says:

    Já baixei o source do projeto, e tentei executar mas o erro que gera é sobre o endereço do endpoint, porém já alterei para a minha aplicação ASP.Net e continua com a mesma mensagem de não poder acessar ‘http://localhost:3024/Negocio/Gateway.aspx’ aqui na minha máquina é ‘http://localhost:3041/Gateway.aspx’.

  13. Roberto Tengan says:

    não sei o que fiz aqui que agora está funcionando direitinho, eu não mechi em nada e ele integrou legal com o ASP.Net. Mistério da Informática, vlw pela ajuda Vinícius.

  14. Claudio says:

    Galera, to com um problemão no fluorineFx, alguém 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″

  15. Vinícius Sandim says:

    Olha Claudio, infelizmente não posso te ajudar, não conheço o exemplo do FluorineFx.
    Mas tenta seguir o tutorial passo a passo que não tem erro.
    Se preferir baixa o Source pra ver o funcionamento, talvez fique mais fácil.

  16. Claudio says:

    Valew Vinicius, mas já li toda a documentação …. e não tem nda referente a isso. mas já uso o fluorine há algum tempo e fui ver que isso ocorre só agora ….. coisa de maluco “”"

  17. Roberto Tengan says:

    Bom dia, Vinúcius.

    Agora eu estou utilizando a solução FlurineFx para integrar o Flex com a minha aplicação ASP.Net, fiz todos os passos corretamente e dá esse erro:

    faultCode:Client.Error.MessageSend faultString:’Send failed’ faultDetail:’Channel.Connect.Failed error NetConnection.Call.Failed: HTTP: Status 404: url: ‘http://localhost:1977/card/Gateway.aspx”

    esse link eu consigo acessar via browser.

  18. Leandro says:

    Boa noite Vinicius!
    Muito obrigado pelo tutorial! Funcionou certinho aqui.

    Parabéns!

  19. jcarlos says:

    Estou fazendo aqui com o Flex 3 e Visual Studio 2008 mas esbarrei em alguns provaveis erros de digitação. Podem ser erros meus, mas caso não sejam podem ajudar a fazer pequenos reparos no execelente tutorial.

    como estou copiando e colando e logo os imports não foram gerados e gerou erro de compilação;

    Tive que acrescentar os seguintes

    import mx.rpc.events.FaultEvent;
    import mx.rpc.remoting.RemoteObject;
    import mx.rpc.events.ResultEvent;
    import mx.controls.Alert;
    import mx.controls.Button;
    import classesMapeamento.*;

    Outro erro estava associado ao package mapeamento dentro de classesMapeamento. Podem ter nomes diferentes?

    Quando alterei para
    package classesMapeamento
    {
    [RemoteClass(alias="IntegracaoFlex.Pessoa")] //Namespace.Classe do asp.net

    ao contrário de package mapeamento parou de dar erro de compilação.

    No script o campo está

    pessoa.Id_Pessoa = int(txtId_Cadastro.text);

    mas na recomendação para nomear o TextInput está

    TextInputs: txtId_Pessoa, txtNome, txtTelefone
    Button: btnInserir

    Alterei então para pessoa.Id_Pessoa = int(txtId_Pessoa.text);

    e parou de dar erro de compilação

    Acho que segui tudo direito, mas fiquei com dúvidas na parte final. Fiz o Release Build no Flex e copiei para o diretório aonde estava rodando o projeto do VisualStudio via o servidor interno dele.

    Quando clico em Listar recebo

    Error: Cannot assign operations into an RPC Service (showBusyCursor)
    at mx.rpc::AbstractService/http://www.adobe.com/2006/actionscript/flash/proxy::setProperty()
    at IntegracaoFlex/preparaRemoteObj()
    at IntegracaoFlex/btnListar_click()
    at IntegracaoFlex/__btnListar_click()

    O que devo estar fazendo de errado ?

    Grato

  20. Vinícius Sandim says:

    Oi Carlos, boa noite…

    Muito obrigado por postar estes erros que foram encontrados no tutorial, vou providenciar as correções em breve.

    Sobre o erro que você apontou, ele está ocorrendo porque você importou a classe RemoteObject do package errado.

    O correto é :
    - mx.rpc.remoting.mxml.RemoteObject;

    E não:
    - mx.rpc.remoting.RemoteObject;

    Isso já havia ocorrido com um outro desenvolvedor, meu xará rsrsr…
    http://www.viniciussandim.com/?p=80#comment-18

    =D

  21. Marco Antonio says:

    Ola vinicius, segui o seu tutorial e funcionou direitinho so que agora parou de funcionar a serialização do objeto ta aparecendo o seguinte erro

    Ocorreu um erro ao tentar executar o método no asp.net.

    faultCode:Server.Processing faultString:’Could not find a suitable method with name Insere’ faultDetail:’null’

    minhas classes estao igual o exemplo

  22. Vinícius Sandim says:

    Marco, dá uma conferida na assinatura do método Insere, lembre-se que o C# é case sensitive, veja tambem se no send() do getOperation do Flex você está enviando os atributos que são esperados no C#.

    Se você não encontrar, tem o source deste projeto disponível para download neste link:

    http://www.viniciussandim.com/downloads/IntegracaoFlex.rar

    100 +;

  23. Daniele says:

    Vinicius fiz como você aconselhou, porém o flex não acha o método Inserir

  24. Vinícius Sandim says:

    Daniele, de uma olhada com calma, deve estar faltando algum detalhe pequeno.
    O tutorial já foi feito por várias pessoas e funciona normalmente.

  25. Leandro says:

    Olá Vinicius bom dia!

    Cara trabalho com Flex a pouco mais de 1 ano e nunca trabalhei com C#, gostaria que vc me desse um exemplo de como fazer um CRUD no C# acessando dados diretamente de um BD!!!!

    Ou me passasse algum tutorial da net que vc tenha conhecimento.

    Abraços.

  26. Vinícius Sandim says:

    Hey, boa noite…

    Você já viu o exemplo da agenda, é um CRUD básico com C# acessando Access:
    http://www.viniciussandim.com/?p=167

    Att

  27. Christiano says:

    Vinícius:

    Primeiramente gostaria de parabenizá-lo pelo excelente artigo. Comecei a trabalhar com Flex e precisava integrar com ASP.NET usando Fluorine. Esse tutorial me salvou.

    Sem querer abusar gostaria de uma ajuda. Dá uma olhada no código abaixo:

    private function rstSucessoCombo(evt:ResultEvent):void {
    if (evt.result != null) {
    cbo.dataProvider = (evt.result as ArrayCollection);
    }
    }

    private function preencheComboUso(): void {
    //Executa o método no asp.net
    var remoteObj:RemoteObject = preparaRemoteObj(rstFalha, rstSucessoCombo);
    remoteObj.getOperation(”busListar”).send();
    }

    private function showDetails():void {
    preencheCombo();

    var arrAux: ArrayCollection = ArrayCollection(cbo.dataProvider);
    }

    Tentei resumir o código para não ficar complicado. Ao executar a função showDetails() eu observo que a variável auxArr retorna uma lista vazia. O curioso é que somente depois de executar o método showDetails é que ele executa a função rstSucessoCombo, sendo que esta função que traz os dados do banco. Desta forma o array fica sempre vazio pois ele só chama o rstSucessoCombo após a execução do método que chamou o RemoteObj.

    Poderia me ajudar?

    Obrigado.

  28. Vinícius Sandim says:

    Olá Christiano, é o seguinte..

    O Flex trabalha de forma assíncrona, e por esse motivo temos sempre que ter uma função de Result, assim como é a sua rstSucessoCombo.

    Acontece o seguinte, do jeito que você exemplificou, o Flex vai rodar essa linha:

    var arrAux: ArrayCollection = ArrayCollection(cbo.dataProvider);

    Antes dessa:

    if (evt.result != null) {
    cbo.dataProvider = (evt.result as ArrayCollection);
    }

    Portanto, se eu entendi bem, para fazer o que você quer, a linha anterior deve ser colocada abaixo dessa dai, da seguinte maneira:

    if (evt.result != null) {
    cbo.dataProvider = (evt.result as ArrayCollection);
    var arrAux: ArrayCollection = ArrayCollection(cbo.dataProvider);
    }

    Porque ai sim você terá a certeza que ela vai ser executada depois do carregamento do combo.

  29. Bruno says:

    Sadim,

    Ë possível fazer o flex comunicar com duas uris diferentes ? Ora eu chamo um método de um projeto asp.net, ora de outro ?
    Pq tenho uma aplicacao asp.net com flex que valida o login de um usuário e no flex eu capturo a classe do usuário com os seus respectivos dados. Agora eu não sei como fazer para retirar isto do swf e passar para minha aplicação corrente em asp.net para assim deixar na seção da aplicação principal

    Agradeço a atenção

  30. Airton says:

    Vinícius,

    Antes de mais nada, parabéns pelo tutorial!
    Mas, tentando executar todos os passos, ao rodar a aplicação (baixei o fonte que vc disponibilizou para verificar e está tudo correto), exibe o erro:

    “Ocorreu o seguinte erro ao tentar executar o método:
    faultCode:Client.Error.MessageSend faultString:’Send failed’ faultDetail:’Channel.Connect.Failed error NetConnection.Call.BadVersion: : url: ‘http://localhost:50640/integracao/Negocio/Gateway.aspx””

    O estranho é que este endereço acima está rodando perfeitamente (fica uma página em branco, como vc sugere no tutorial). O Flex é que não está conseguindo encontrá-lo…
    Vc saberia me dizer pq isso ocorreu?

    Abs!

  31. Joao Henrique says:

    Amigo, fiz todos os passos e ao final recebi o seguinte erro…

    Ocorreu o seguinte erro ao tentar executar o método:
    faultCode:Client.Error.MessageSend faultString:’Send failed’ faultDetail:’Channel.Connect.Failed error NetConnection.Call.Failed: HTTP: Status 500: url: ‘http://localhost:49683/Gateway.aspx”

    Alguma idéia?

  32. Daniel Jr. says:

    Primeiramente gostaria de parabenizá-lo pelo artigo, que na minha opnião é um dos melhores sobre o assunto em português. Fiz o exemplo, e cheguei a implementar na minha classe c# o linq to sql para fazer a persistência dos dados, porém meu método insere retorna erro se eu coloco um ojeto do tipo da classe como parâmetro. exemplo: public string void insere(Pessoa obj){…}
    se eu retirar o parâmetro e fizer um teste retornando uma string, funciona ok. O que poderia ser?

  33. Ricardo Costa says:

    Testei e funcionou ok. Porém, estou com 2 problemas: 1. Não consigo popular um combo box com o resultado da Lista.
    2. Tenho uma chave estrangeira, por exemplo Pessoa -> Tipo Pessoa. Seu exemplo não tem este caso e não consegui fazer aqui. Vc pode me ajudar dando um exemplo?

  34. Jonatas Faria says:

    Vinicius, boa noite

    Fiz os passos que você descreveu e em ambiente de desenvolvimento, funciona muito bem, mas não consigo publicar o projeto ou rodar em outra maquina que esteja com o IIS configurado… Estou executando pelo servidor do VS2008… preciso de um help;

Leave a Reply