locked
Receber informações de HttpWebRequest RRS feed

  • Pergunta

  • Boa tarde a todos, estou com uma duvida que acredito que para muitos seja simples.

    Tenho uma aplicação em silverlight C# que autentica o usuario atravéz de uma pagina externa.

    Eu envio as informações atravéz de POST e essa pagina checa no DB se as informações são corretas e retorna true ou false.

    Não tenho problemas para enviar e receber as informações tudo funciona muito bem porem tenho um problema no tempo que essas informações são recebidas.

    Quando envio as informações elas tem que ser processadas para obter os dados o grande problema é para saber quando isso foi concluido fora da função que lê o stream que foi recebido da pagina externa.

        public string postData(string uri, string qs)
        {
          this.query_string = qs;
          HttpWebRequest req = (HttpWebRequest)WebRequest.Create(new Uri(@uri));
          req.Method = "POST";
          req.ContentType = "application/x-www-form-urlencoded";
          req.BeginGetRequestStream(new AsyncCallback(myReqStream), req);
          return str_ret;
        }
    
        public void myReqStream(IAsyncResult result)
        {
          HttpWebRequest req = result.AsyncState as HttpWebRequest;
          Stream data = req.EndGetRequestStream(result);
          mp.Dispatcher.BeginInvoke(delegate()
          {
            StreamWriter w = new StreamWriter(data);
            w.WriteLine(this.query_string);
            w.Flush();
            w.Close();
            req.BeginGetResponse(new AsyncCallback(myReqResponse), req);
          });
    
        }
    
        public void myReqResponse(IAsyncResult result)
        {
          HttpWebRequest req = result.AsyncState as HttpWebRequest;
          try
          {
            HttpWebResponse res = (HttpWebResponse)req.EndGetResponse(result);
            mp.Dispatcher.BeginInvoke(delegate()
            {
              Stream rStream = res.GetResponseStream();
              StreamReader data = new StreamReader(rStream);
              str_ret = data.ReadToEnd();
              if (str_ret == "1") ; else MessageBox.Show("Usuário ou senha invalidos"); //Nessa linha que mora o problema, como vou saber quando essa linha foi processada pelo programa
            });
          }
          catch (WebException we)
          {
            this.str_ret = we.Message;
          }
          catch (System.Security.SecurityException e)
          {
            this.str_ret = e.Message;
          }
        }
    

    As funções que estou usando são essas, nas funções MyReqResponse e MyReqStream não tenho como colocar um retorno bool ou string ela tem que ser void então como vou saber quando a função chegou ao fim e todos os dados foram processados?

    Porque se a pagina externa retornar true tenho que continuar as proximas etapas e mostrar as informações do usuario em questão que vem de um arquivo XML.

    Caso seja falso sem problema só usa uma MessageBox com uma mensagem dizendo que não foi possivel a autenticação.

    E agora como soluciono esse problema? 


    Agredecido pela ajuda sempre! Qualquer opnião é valida desde que tenha fundamento! http://darksp.myvnc.com
    terça-feira, 23 de novembro de 2010 16:16

Respostas

  • Ola, entao.. sempre que vc trabalha com programação assincrona, a maneira mais facil de trabalhar com retorndo de dados é usando eventos...

    Segue um exemplo de como voce poderia fazer esse processo assincronamente retornando com evento

    using System;
    using System.ComponentModel;
    using System.IO;
    using System.Net;
    using System.Threading;
    
    namespace WebApplication1 {
      public class Class1 {
        public event EventHandler<PostDataCompletedEventArgs> PostDataCompleted;
    
        protected virtual void OnPostDataCompleted(string response, Exception error) {
          var handler = this.PostDataCompleted;
          if (handler != null) {
            handler(this, new PostDataCompletedEventArgs(response, error));
          }
        }
    
        public void PostDataAsync(string uri, string qs) {
          AsyncOperation operation = AsyncOperationManager.CreateOperation(null);
          var thread = new Thread(new ThreadStart(delegate() {
            try {
              var response = PostData(uri, qs);
              operation.PostOperationCompleted(new SendOrPostCallback(delegate(object s) {
                OnPostDataCompleted(response, null);
              }), null);          
            } catch (Exception ex) {
              operation.PostOperationCompleted(new SendOrPostCallback(delegate(object s) {
                OnPostDataCompleted(null, ex);
              }), null);           
            }
          }));
          thread.Start();
        }
    
        private string PostData(string uri, string qs) {
          HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(@uri));
          request.Method = "POST";
          request.ContentType = "application/x-www-form-urlencoded";
    
          using (var requestStream = new StreamWriter(request.GetRequestStream())) {
            requestStream.WriteLine(qs);
            requestStream.Flush();
          }
    
          HttpWebResponse response = (HttpWebResponse)request.GetResponse();
          using (var responseStream = new StreamReader(response.GetResponseStream())) {
            return responseStream.ReadToEnd();
          }
        }
      }
    
      public class PostDataCompletedEventArgs : AsyncCompletedEventArgs {
        public string Response { get; private set; }
    
        public PostDataCompletedEventArgs(string response, Exception error)
          : base(error, error != null, null) {
          this.Response = response;
        }
      }
    }
    

    Eu não sou pago para postar aqui... faço simplesmente porque eu quero....
    • Marcado como Resposta Brasilio Thomazo sexta-feira, 26 de novembro de 2010 22:03
    terça-feira, 23 de novembro de 2010 17:28

Todas as Respostas

  • Ola, entao.. sempre que vc trabalha com programação assincrona, a maneira mais facil de trabalhar com retorndo de dados é usando eventos...

    Segue um exemplo de como voce poderia fazer esse processo assincronamente retornando com evento

    using System;
    using System.ComponentModel;
    using System.IO;
    using System.Net;
    using System.Threading;
    
    namespace WebApplication1 {
      public class Class1 {
        public event EventHandler<PostDataCompletedEventArgs> PostDataCompleted;
    
        protected virtual void OnPostDataCompleted(string response, Exception error) {
          var handler = this.PostDataCompleted;
          if (handler != null) {
            handler(this, new PostDataCompletedEventArgs(response, error));
          }
        }
    
        public void PostDataAsync(string uri, string qs) {
          AsyncOperation operation = AsyncOperationManager.CreateOperation(null);
          var thread = new Thread(new ThreadStart(delegate() {
            try {
              var response = PostData(uri, qs);
              operation.PostOperationCompleted(new SendOrPostCallback(delegate(object s) {
                OnPostDataCompleted(response, null);
              }), null);          
            } catch (Exception ex) {
              operation.PostOperationCompleted(new SendOrPostCallback(delegate(object s) {
                OnPostDataCompleted(null, ex);
              }), null);           
            }
          }));
          thread.Start();
        }
    
        private string PostData(string uri, string qs) {
          HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(@uri));
          request.Method = "POST";
          request.ContentType = "application/x-www-form-urlencoded";
    
          using (var requestStream = new StreamWriter(request.GetRequestStream())) {
            requestStream.WriteLine(qs);
            requestStream.Flush();
          }
    
          HttpWebResponse response = (HttpWebResponse)request.GetResponse();
          using (var responseStream = new StreamReader(response.GetResponseStream())) {
            return responseStream.ReadToEnd();
          }
        }
      }
    
      public class PostDataCompletedEventArgs : AsyncCompletedEventArgs {
        public string Response { get; private set; }
    
        public PostDataCompletedEventArgs(string response, Exception error)
          : base(error, error != null, null) {
          this.Response = response;
        }
      }
    }
    

    Eu não sou pago para postar aqui... faço simplesmente porque eu quero....
    • Marcado como Resposta Brasilio Thomazo sexta-feira, 26 de novembro de 2010 22:03
    terça-feira, 23 de novembro de 2010 17:28
  • Muito obrigado Rui, vou passar passo a passo o codigo, porque honestamente eu não intendi muito bem!

    Mas isso é uma coisa que pode deixar comigo que eu me viro, fico muito agradecido mesmo.

    Valeu Rui Muito obrigado.


    Agredecido pela ajuda sempre! Qualquer opnião é valida desde que tenha fundamento! http://darksp.myvnc.com
    sexta-feira, 26 de novembro de 2010 22:12
  • Imagina....

    A ideia é essa mesma... eu mostro um caminho... vc expoem as suas duvidas... a gente explica.... vc aprende e passa adiante ^^

    Se não entender algo é so perguntar....


    Eu não sou pago para postar aqui... faço simplesmente porque eu quero....
    segunda-feira, 29 de novembro de 2010 14:04