2010-11-24 3 views
2

Première utilisation de Silverlight! Après un tutoriel en ligne. Je crée une application qui permet à l'utilisateur de rechercher des histoires sur le site Web de Digg à l'aide d'un client Web et de les afficher dans une grille de données dans un contrôle Silverlight.WebClient.DownloadStringAsync Lancement d'une exception de sécurité dans Silverlight

Voici le code:

private void btnSearch_Click(object sender, RoutedEventArgs e) 
{ 
    string topic = txtTopic.Text; 

    string diggUrl = String.Format("http://services.digg.com/stories/topic/{0}?count=20&appkey=http%3A%2F%2Fscottgu.com", topic); 

    WebClient diggService = new WebClient(); 
    diggService.DownloadStringCompleted += new DownloadStringCompletedEventHandler(diggService_DownloadStringCompleted); 
    diggService.DownloadStringAsync(new Uri(diggUrl)); 
} 

void diggService_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
{ 
    if (e.Error == null) 
    { 
     DisplayStories(e.Result); 
    } 
} 

Chaque fois que je mets un point d'arrêt sur le gestionnaire d'événements diggService_DownloadStringCompleted et cliquez sur le bouton de recherche e.Error est toujours égal à un System.Security.SecurityException sans message et une exception intérieure du même tapez avec un message d'erreur de sécurité. La trace de pile est:

à System.Net.Browser.AsyncHelper.BeginOnUI (SendOrPostCallback beginMethod, l'état de l'objet)

à System.Net.Browser.BrowserHttpWebRequest.EndGetResponse (IAsyncResult asyncResult)

au système .Net.WebClient.GetWebResponse (demande WebRequest, IAsyncResult résultat)

à System.Net.WebClient.DownloadBitsResponseCallback (résultat IAsyncResult)

Après quelques googler lourds que j'ai vu peopl e mentionne un fichier crossdomain.xml. Pas tout à fait sûr de ce que c'est mais j'ai ajouté un au répertoire racine du serveur Web exécutant le contrôle Silverlight et ajouté le texte suivant. n'a fait aucune différence:

<?xml version="1.0" ?> 
<cross-domain-policy> 
    <allow-access-from domain="*" /> 
</cross-domain-policy> 

Que se passe-t-il?

+0

Avez-vous résolu cela? J'ai le même problème – Andrew

Répondre

2

Le fichier crossdomain.xml doit être placé sur le serveur sur lequel vous essayez de télécharger le fichier, et non sur le serveur qui dessert l'application Silverlight.

Si le serveur ne possède pas de fichier crossdomain.xml, le moteur d'exécution Silverlight n'autorise pas votre application à télécharger des données à partir de ce serveur. Par défaut, il ne peut accéder qu'au serveur sur lequel il a été téléchargé (même règle d'origine).

+0

ok bien compte tenu de ce tutoriel est sur le site digg je suis assez certain qu'ils auraient un crossdomain.xml sur leur serveur. est-il de toute façon de savoir? –

+0

http://services.digg.com/crossdomain.xml ne ressemble pas à un fichier crossdomain.xml bien formé. – dtb

+0

Ce n'est pas un fichier crossdomain.xml. Apparemment, lors de l'utilisation de services.digg.com, il interprète la requête comme une méthode RESTful et échoue avec une erreur confuse. – WiredPrairie

0

Digg.com n'a pas de fichier crossdomain (ce qui signifie que les clients Silverlight et Flash ne peuvent pas utiliser directement l'API). L'accès direct depuis Silverlight n'est pas possible.

Une solution consiste à créer un proxy sur votre hôte Web. Le proxy appellera les API de Digg depuis votre serveur Web plutôt que directement depuis le client Silverlight.

Silverlight ==> YourWebHost ==> Digg.com

Une autre solution serait d'utiliser leur API JavaScript à la place, puis utiliser le pont JavaScript afin de communiquer JavaScript de Silverlight.

Silverlight ==> JavaScript ==> Digg.Com ==> JavaScript ==> Silverlight

Pour un appel JavaScript: http://developers.digg.com/response

référence pont Silverlight: http://msdn.microsoft.com/en-us/library/cc645076(VS.95).aspx Démonstrations: Silverlight JavaScript: http://msdn.microsoft.com/en-us/library/cc221359(v=VS.95).aspx JavaScript pour Silverlight: http://msdn.microsoft.com/en-us/library/cc221414(v=VS.95).aspx

+0

Digg a un fichier crossdomain http://services.digg.com/crossdomain.xml donc des idées pourquoi cela ne fonctionnerait pas? – Andrew

+0

ne sont pas toutes ces restrictions de sécurité un peu tiré par les cheveux quand vous pouvez les contourner en utilisant le pont Javascript? –

+0

@ GeorgeBirbilis- J'ai dit cela dans ma réponse. – WiredPrairie

Questions connexes