Domanda

Ho un problema qui.

Ho un sito Web ASP.net che ospita un'applicazione silverlight 2. Vorrei che il sito comunicasse da e verso l'app Silverlight e lo sto facendo tramite richieste http. Per inciso, se qualcuno conosce un modo migliore, per favore, dimmelo.

Il mio server ha il seguente listener http impostato. Ho copiato questo da un sito tutorial da qualche parte, dato che al momento è principalmente la sperimentazione:

      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(  );

Sto usando il seguente codice per inviare una richiesta:

 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;
            }
        }

Il mio problema è che posso collegarmi al server web da un'applicazione console usando praticamente lo stesso codice (l'ho testato impostando un punto di interruzione nel codice), tuttavia non succede nulla quando faccio clic sul pulsante in Silverlight. (Ho aggiunto " Hello World " per verificare che sto effettivamente collegando il delegato al pulsante.)

Ho letto che silverlight ha bisogno di criteri per connettersi tramite client web, ma non dovrebbe essere il caso se sto usando lo stesso server e lo stesso dominio sia per il server che per l'applicazione silverlight!

Grazie per tutte le tue risposte!

EDIT: sto ricevendo questa eccezione:

System.Security.SecurityException --- > System.Security.SecurityException: errore di sicurezza.

Inoltre, in base a ciò che sono reading sembra essere il sito di origine, anche l'URI di distribuzione di xap e l'URI di richiesta devono avere la stessa porta.

Tuttavia, quando imposto le proprietà per il server da ospitare su una porta specifica e imposto al listener di ascoltare quella stessa porta, fallisce con il messaggio che il processo non può accedere al file perché è in uso con un altro processo. Suppongo che sia perché il listener http non può ascoltare la stessa porta utilizzata per ospitarla: | Ma come posso fare in modo che Silverlight esegua le richieste di client web di origine?

È stato utile?

Soluzione

Poiché questo è solo un test, aggiungi un " else TextBox1.Text = e.Error.ToString (); " nel tuo gestore TestDownloadStoriesCompleted per vedere quale errore ricevi.

EDIT:

Non puoi ospitare sia l'app asp.net che il tuo listener sulla stessa porta: puoi risolverlo usando una porta diversa e servendo un clientaccesspolicy.xml dal tuo httplistener.

Comunque penso che avrebbe più senso dare un'occhiata ai servizi web WCF (aggiungi lo svc alla tua app asp.net). Ecco un campione.

Altri suggerimenti

puoi utilizzare strumenti come http://www.fiddler2.com/fiddler2/ per vedere effettivamente cosa sta succedendo durante la richiesta .... Ciò può essere di aiuto per ulteriori debug ...

Ora sto usando i gestori HTTP per la comunicazione. Sembra che funzioneranno abbastanza bene per il mio scopo, anche se voglio ancora provare alcuni WCF.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top