none
Comunicar ASP.NET com Windows Forms RRS feed

  • Pergunta

  • O problema é o seguinte, Trabalho com SAT-CFe e a comunicação com Este é feito Via USB o que impossibilita meu sistema Web de fazer a comunicação direta com ele, O que eu fiz, Criei uma Aplicação Desktop que faz essa comunicação com o Hardware SAT e se comunica com o sistema ASP.NET fiz isso usando Socket, Funciona. Porém tem uma problema quando o XML que eu envio via socket é maior do que 6kb ele chega incompleto. E nao vai de jeito nenhum, Ja aumentei buffer fiz de Tudo e nao cheguei a lugar algum.. Vou postar os metodos cliente e servidor:

    Cliente: 

           
    //Mensagem de Retorno Servidor em Byte
               byte[] retornoServidorByte = new byte[1024 * 5000];
               // byte[] retornoServidorByte = new byte[10485760];
                //Tenta enviar o arquivo ao cliente
                try
                {
                    //Cria o IpEnd que sera o destino .. Este é atribuido o valor real abaixo
                    IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, 0);
    
                    
                        IPAddress ip = IPAddress.Parse(Auxiliares.sipRealCliente);
                        ipEnd = new IPEndPoint(ip, 5859);
    
                    //Cria o Socket
                    Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
    
                    //Convert em Bit o xml a ser enviado ao cliente
                    byte[] clientData = Encoding.UTF8.GetBytes(xml);
    
                    try
                    {
                        //Coneta com o Cliente
                        clientSock.Connect(ipEnd);
                        //Envia os dados
                        clientSock.Send(clientData);
                        //Recebe o retorno do Servidor
                        clientSock.Receive(retornoServidorByte);
                    }
                    catch (SocketException soc)
                    {
                        return soc.Message;
                    }
    
    
    
                    clientSock.Close();//Fecha a conexao com o Cliente
    
                    //Monta o retorno em String
                    return Encoding.UTF8.GetString(retornoServidorByte);
    
                }
                catch (Exception ex)
                {
                    return ex.Message;
                }
    


    Servidor:

       
      try
                {
                    //Classes
                    Sat sat = new Sat();
                    Config config = new Config();
    
    
                    WriteLog("Iniciando servidor...");
    
                    //Cria o Ip que subira o servidor
                    IPEndPoint ipEnd = new IPEndPoint(IPAddress.None, 0000);
                    //Verifica se usara ipLocal automatico ou o Ip configurado
                    if (config.ConfigAutomatica == true)
                    {
                        ipEnd = new IPEndPoint(IPAddress.Parse(Config.GetIp()), 5859);
                    }
                    else
                    {
                        ipEnd = new IPEndPoint(IPAddress.Parse(config.Ip), config.Porta);
                    }
    
                    //Cria o SOCK
                    Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
    
                    //Especifica ao Sock qual Ip Sera usadao
                    sock.Bind(ipEnd);
    
                    //Começa Ouvir no maximo 100 Solicitaçoes
                    sock.Listen(100);
    
                    WriteLog("Servidor iniciado e escutando em: " + ipEnd.Address + ":" + ipEnd.Port);
                    WriteLog("Aguardando nova conexao cliente...");
    
                    Thread listen = new Thread(() =>
                    {
                        while (true)
                        {
    
                            //Aceita a conexao
                            using (Socket clientSock = sock.Accept())
                            {
    
                                WriteLog("Cliente: " + clientSock.RemoteEndPoint + " Conectado");
    
                                //Cria uma Thread
                                //var threadData = new Thread(() =>
                                //{
                                //Armazena o retorno vindo do cliente
                               byte[] clientData = new byte[1024*5000];
                             //   byte[] clientData = new byte[10485760];
                                //Recebe os arquivos do Cliente
                              int k = clientSock.Receive(clientData);
    
                                WriteLog("Recebendo dados cliente...");
    
    
                                //Converte o valor vindo do servidor para string
                                string xml = Encoding.UTF8.GetString(clientData).Replace("\0", string.Empty);
                      
                                //Troca a codificação do XML para UTF-8
                                xml = xml.Replace("utf-16", "utf-8");
    
                                WriteLog("Arquivo Recebido com sucesso!!");
                                var retorno = "Recebido com Sucesso!";
    
                                //Pega o retorno do SAT e envia devolta ao cliente
                                byte[] arquivoRetorno = Encoding.UTF8.GetBytes(retorno);
                                clientSock.Send(arquivoRetorno);
    
                                //Fecha a conexao
                                clientSock.Close();
    
                                WriteLog(System.Environment.NewLine);
                                WriteLog("Aguardando nova conexao cliente...");
                                //});
                                //threadData.Start(); //Inicia novamente a Thread
                            }
                        }
                    });
                    listen.IsBackground = true;
                    listen.Name = "Servidor";
                    listen.Start();
                }
                catch (Exception ex)
                {
                    Config.GravarLog(Types.TipoLog.Erro, ex, "");
                    WriteLog("Ocorreu uma falha: " + ex.Message);
                }



    Gostaria de saber o que posso mexer no codigo para arrumar isto, ou se existe alguma outra forma melhor de se fazer essa comunicação entre uma Aplicação Web com uma Aplicação Local Desktop.
    Fico agradecido pela ajuda de todos.
    sexta-feira, 30 de setembro de 2016 19:14

Respostas

  • Gostaria de saber o que posso mexer no codigo para arrumar isto, ou se existe alguma outra forma melhor de se fazer essa comunicação entre uma Aplicação Web com uma Aplicação Local Desktop.
    Fico agradecido pela ajuda de todos.

    Edenílson, bom dia. Eu diria que a melhor forma de realizar este tipo de comunicação não é entre sockets. Minha sugestão é que sua aplicação desktop façca uma chamada HTTP para o seu servidor ASP.NET MVC enviando o conteúdo do XML. Na sua aplicação ASP.NET MVC você teria uma Action em um Controller responsável por receber este request e fazer todo o tratamento necessário, algo assim:

    Na sua app MVC, uma action:

    public async task<ActionResult> ProcessarXml(string xml)
    {
        //faz os tratamentos que precisa no XML
    
        
        return Task.FromResult(Content("seu retorno"));
    }

    Na sua app Desktop, uma chamada:

    using System.Net.Http;
    
    public class EnviadorDeXml
    {
        public async Task<string> Enviar(string xml)
        {
            using (var client = new HttpClient())
            {
                var content = new System.Net.Http.StringContent(xml);
    
               var response = await client.PostAsync("http://url-do-seu-site/controller/processarxml", content);
            }
        }
    }

    Desta forma você está utilizando melhor os recursos da sua aplicação ASP.NET MVC. 

    segunda-feira, 10 de outubro de 2016 13:38

Todas as Respostas

  • Olha nunca precisei fazer nada parecido mas se você tem uma aplicação ASP e tem uma aplicação Desktop em windows forms e se você usar o componente webbrowser na sua aplicação desktop e abrir sua pagina ASP dentro dele ? isso não te ajudaria.

    Junior

    sexta-feira, 30 de setembro de 2016 23:01
  • Se entendi bem, a aplicação cliente é a aplicação Web, certo? Caso sim, já tentou colocar o código em uma aplicação console pra verificar onde está ocorrendo esta limitação?

    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer". Se achou este post útil, por favor clique em "Votar como útil". Se por um acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    terça-feira, 4 de outubro de 2016 18:20
  • Gostaria de saber o que posso mexer no codigo para arrumar isto, ou se existe alguma outra forma melhor de se fazer essa comunicação entre uma Aplicação Web com uma Aplicação Local Desktop.
    Fico agradecido pela ajuda de todos.

    Edenílson, bom dia. Eu diria que a melhor forma de realizar este tipo de comunicação não é entre sockets. Minha sugestão é que sua aplicação desktop façca uma chamada HTTP para o seu servidor ASP.NET MVC enviando o conteúdo do XML. Na sua aplicação ASP.NET MVC você teria uma Action em um Controller responsável por receber este request e fazer todo o tratamento necessário, algo assim:

    Na sua app MVC, uma action:

    public async task<ActionResult> ProcessarXml(string xml)
    {
        //faz os tratamentos que precisa no XML
    
        
        return Task.FromResult(Content("seu retorno"));
    }

    Na sua app Desktop, uma chamada:

    using System.Net.Http;
    
    public class EnviadorDeXml
    {
        public async Task<string> Enviar(string xml)
        {
            using (var client = new HttpClient())
            {
                var content = new System.Net.Http.StringContent(xml);
    
               var response = await client.PostAsync("http://url-do-seu-site/controller/processarxml", content);
            }
        }
    }

    Desta forma você está utilizando melhor os recursos da sua aplicação ASP.NET MVC. 

    segunda-feira, 10 de outubro de 2016 13:38
  • Benvindo Vinicius!


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    segunda-feira, 10 de outubro de 2016 14:27
    Moderador
  • Desculpa a demora na resposta, Se passaram 2 anos e ainda sofro com o mesmo problema, A questão é que a comunicação é ao inverso, A aplicação ASP.NET manda a requisição, A desktop lê o xml, Envia para o aparelho, pega o retorno do aparelho na USB, e devolve a resposta para a Aplicação em Asp.Net.. O uso do sat me permite esse envio e resposta, pois mantem uma conexão entre os dois.. A questão do tamanho do XML eu resolvi "quebrando" o xml enviando picado, E no servidor (Desktop) eu remonto ele.. Porém com Socket tem o problema de ter de ficar abrindo porta no Roteador dos clientes.. Mas não achei outra solução ainda 
    quarta-feira, 10 de outubro de 2018 06:37