2009-01-28 19 views
1

Je tente d'écrire dans un formulaire à partir d'un appel asynchrone. Les exemples que j'ai vus en ligne montrent que cela devrait fonctionner mais je continue à avoir une erreur.Erreurs lors de la tentative d'utilisation de HttpWebRequest dans Silverlight 2

D'abord l'appel qui est fait alors que le Disbatcher n'appelle jamais p. Deuxièmement, je reçois une exception System.Security.SecurityException lors de l'appel req.EndGetResponse (a);

Quel pourrait être le problème?

public partial class Page : UserControl 
{ 
    Uri url = new Uri("http://www.google.com", UriKind.Absolute); 
    HttpWebRequest req; 

    private delegate void PrintToUIThread(string text); 
    PrintToUIThread p; 

    public Page() 
    { 
     InitializeComponent(); 
     req = (HttpWebRequest)WebRequest.Create(url); 
     p = new PrintToUIThread(print); 
     req.BeginGetResponse(new AsyncCallback(WebComplete), req); 
    } 

    void WebComplete(IAsyncResult a) 
    { 
     try 
     { 
      Dispatcher.BeginInvoke(p); 
      HttpWebRequest req = (HttpWebRequest)a.AsyncState; 
      HttpWebResponse res = (HttpWebResponse)req.EndGetResponse(a); 
      Dispatcher.BeginInvoke(p); 
     } 
     catch (Exception ex) 
     { 
      print(ex.ToString()); 
     } 
    } 

    private void print(string text) 
    { 
     PageTextBox.Text = text; 
    } 

    private void print() 
    { 
     PageTextBox.Text = "Call From Invoke"; 
    } 
} 

Répondre

1

Il n'y a rien de fondamentalement mauvais avec votre code de demande/réponse d'après ce que je peux voir. Vous êtes probablement confronté à l'exception de sécurité en raison des restrictions inter-domaines impliquées par le fichier crossdomain.xml de google.

C'est le crossdomain.xml de Google:

<?xml version="1.0"?> 
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"> 
<cross-domain-policy> 
    <site-control permitted-cross-domain-policies="by-content-type" /> 
</cross-domain-policy> 

Tout cela est en train de dire est "Hey, app RIA, utilisez un proxy". Fondamentalement, configurez un appel de service Web WCF ou ASMX avec votre serveur "convivial" avec un fichier clientaccesspolicy.xml en place, utilisez votre serveur pour faire la demande http, puis renvoyez les résultats. Je ne suis pas sûr si google soutient JSONP, mais vous pourriez essayer aussi.