Pergunta

Eu tenho um problema aqui.

Eu tenho um site ASP.NET hospedando um aplicativo Silverlight 2. Gostaria que o site se comunicasse e para cá do aplicativo Silverlight, e estou fazendo isso por meio de solicitações HTTP. Aliás, se alguém souber de uma maneira melhor, por favor me diga.

Meu servidor tem o seguinte ouvinte HTTP configurado. Copiei isso de um site de tutorial em algum lugar, já que é principalmente experimentação no momento:

      HttpListener listener = new HttpListener (  );
      listener.Prefixes.Add("http://localhost:4531/MyApp/");  
      listener.Start(  );                                         

      // Wait for a client request:
      HttpListenerContext context = listener.GetContext(  );

      // Respond to the request:
      string msg = "You asked for: " + context.Request.RawUrl;
      context.Response.ContentLength64 = Encoding.UTF8.GetByteCount (msg);
      context.Response.StatusCode = (int) HttpStatusCode.OK;

      using (Stream s = context.Response.OutputStream)
      using (StreamWriter writer = new StreamWriter (s))
        writer.Write (msg);

      listener.Stop(  );

Estou usando o seguinte código para enviar uma solicitação:

 private void MyButton_Click(object sender, RoutedEventArgs e)
        {
            Button b = sender as Button;
            b.Content = "Hello World";

            Uri serviceUri = new Uri("http://localhost:4531/MyApp/");
            WebClient downloader = new WebClient();
            downloader.DownloadStringCompleted += new DownloadStringCompletedEventHandler(TestDownloadStoriesCompleted);
            downloader.DownloadStringAsync(serviceUri);

        }
        void TestDownloadStoriesCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                TextBox1.Text = e.Result;
            }
        }

Meu problema é que posso me conectar ao servidor da web a partir de um aplicativo de console usando praticamente o mesmo código (testei -o definindo um ponto de interrupção no código), mas nada acontece quando clico no botão no Silverlight. (Eu adicionei o "Hello World" para testar que estou realmente conectando o delegado ao botão.)

Eu li que o Silverlight precisa de políticas para se conectar via webclient, mas não deve ser o caso se eu estiver usando o mesmo servidor e o mesmo domínio para o servidor e o aplicativo Silverlight!

Obrigado por todas as suas respostas!

EDIT: Estou recebendo esta exceção:

System.Security.SecurityException ---> System.Security.SecurityException: erro de segurança.

Além disso, com base no que sou leitura Aparentemente, para ser o local de origem, o URI de implantação do XAP e o URI da solicitação também devem ter a mesma porta.

No entanto, quando eu defino as propriedades para o servidor ser hospedado em uma porta específica e defino o ouvinte para ouvir a mesma porta, ele falha com a mensagem de que o processo não pode acessar o arquivo porque está sendo usado por outro processo . Presumo que seja porque o ouvinte HTTP não pode ouvir a mesma porta que está sendo usada para hospedá -la: | Mas como posso fazer com que o Silverlight execute solicitações de origem webclient?

Foi útil?

Solução

Como este é apenas um teste, adicione um "else textbox1.text = e.error.toString ();" No seu manipulador de TestdownloadStoriesCompleted para ver qual erro você recebe.

EDITAR:

Você não pode hospedar o aplicativo ASP.NET e seu ouvinte na mesma porta - você pode corrigir isso usando uma porta diferente e atendendo a um clientAccesspolicy.xml do seu httplistener.

No entanto, acho que faria mais sentido para você dar uma olhada nos serviços da WCF Web (você adiciona o SVC ao seu aplicativo ASP.NET). Aqui está um amostra.

Outras dicas

você pode usar ferramentas como http://www.fiddler2.com/fiddler2/para realmente ver o que está acontecendo durante o pedido .... isso pode dar ajuda para mais depuração ...

Agora estou usando manipuladores HTTP para comunicação. Parece que eles funcionarão bem o suficiente para o meu propósito, embora eu ainda queira experimentar algum WCF.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top