web-dev-qa-db-fra.com

Silverlight Crossdomain

J'ai vu beaucoup de liens vers MSDN et "fonctionne sur ma machine!" réponses, je voudrais donc poser ma question avec les étapes exactes pour dupliquer ce que je fais. Comme nous utilisons un service Web déjà existant, je pose la question du contexte d’un service Web hébergé en dehors de mon projet, contrairement à la plupart des tutoriels et des vidéos en ligne. Alors, voici:

*** Créez un nouveau projet de service Web ASP.NET.

Il viendra avec un fichier Service.asmx existant exposant une méthode Web "HelloWorld".

Voir dans le navigateur, cliquez sur le bouton "Invoke". Cela devrait fonctionner en renvoyant la chaîne "Hello World".

Sur ma machine, l'URL est la suivante: " http: // localhost: 15511/WebSite5/Service.asmx "

*** Démarrer une nouvelle instance de Visual Studio, créer un projet d'application Web Silverlight. 

*** Collez un seul bouton dessus avec un gestionnaire d’événements pour appeler le service Web. Personnellement, je nuke la grille et utilise un StackPanel simple. par exemple.

<UserControl x:Class="SilverlightApplication1.Page"
    xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml" 
    Width="400" Height="300">
    <StackPanel>
        <Button Click="Button_Click">
            <Button.Content>
                <TextBlock Text="Test"/>
            </Button.Content>
        </Button>
    </StackPanel>
</UserControl>

Ajoutez la référence Web à l'aide du gestionnaire d'instructions et d'événements pour Button_Click:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        ServiceSoapClient client = new ServiceSoapClient();
        client.HelloWorldCompleted += (object s, HelloWorldCompletedEventArgs ea) => { 
            MessageBox.Show(ea.Result); 
        };
        client.HelloWorldAsync();
    }

Courez et bien sûr, il explose à cause de problèmes de domaines croisés. Ajoutez ensuite le fichier clientaccesspolicy.xml avec les éléments suivants à la racine de votre application Web hébergeant le service: 

<?xml version="1.0" encoding="utf-8" ?>
<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from http-request-headers="*">
        <domain uri="*"/>
      </allow-from>
      <grant-to>
        <resource include-subpaths="true" path="/"/>
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>

Cela devrait ouvrir les choses car il a un joker pour les en-têtes, les uris et les ressources, non?

  • Exécutez à nouveau et vous obtenez une erreur: 

Une erreur s'est produite lors de la tentative de requête à l'URI ' http: // localhost: 15511/WebSite5/Service.asmx '. Cela peut être dû à une tentative d'accès à un service de manière inter-domaines sans qu'une stratégie inter-domaines appropriée soit en place, ou une stratégie inappropriée pour les services SOAP. Vous devrez peut-être contacter le propriétaire du service pour publier un fichier de stratégie inter-domaines et vous assurer qu'il autorise l'envoi des en-têtes HTTP liés à SOAP.

Alors question: y at-il un secret dans le fichier clientaccesspolicy? Vous pouvez également essayer crossdomain.xml, mais le résultat est similaire.

25
t3rse

J'ai eu le même problème plusieurs fois. Dans le passé, j'ai résolu ce problème en utilisant l'application Web comme démarrage, mais il semble que vous l'ayez déjà fait. 

Mon post sur le sujet: http://www.donnfelker.com/silverlight-cross-domain-issue/

5
Donn Felker

J'ai rencontré ce problème (SL v5.0 et Visual Studio 2010). Ce qui a été résolu, c'est que je suis entré dans les propriétés du projet Silverlight >> onglet Silverlight et que j'ai sélectionné "Exiger une confiance élevée lors de l'exécution dans le navigateur".

7
Socardo

Assurez-vous de placer le fichier clientaccesspolicy.xml à la racine du répertoire Web IIS, par exemple.

C:\Inetpub\wwwroot\clientaccesspolicy.xml

Cela garantira qu'il est accessible directement à l'adresse http: ///clientaccesspolicy.xml

Je recevais la même erreur et je l'ai résolu en procédant comme suit.

4
Deven

Quelque chose qui a fonctionné pour moi a commencé avec ce que j'ai trouvé sur les forums silverlight ici . Il a essentiellement demandé si je pouvais même get sur mon clientaccesspolicy.xml ou crossdomain.xml de localhost (http: //localhost/clientaccesspolicy.xml). Lorsque j’ai essayé de naviguer là-bas, j’ai tout simplement trouvé le code correspondant à chacun d’eux (également dans le fil de discussion susmentionné), puis un copier-coller sur le code contenu dans ces fichiers existant dans mon répertoire inetpub\wwwroot\(I ouvert avec Notepad ++). La partie étrange était  le code n'a pas changé du tout et pourtant, ça marche! J'espère que ça aide quelqu'un! C'était extrêmement étrange. 

clientaccesspolicy.xml

<?xml version="1.0" encoding="utf-8"?>
 <access-policy>
  <cross-domain-access>
    <policy>
      <allow-from http-request-headers="*">
        <domain uri="*"/>
      </allow-from>
      <grant-to>
        <resource path="/" include-subpaths="true"/>
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>

crossdomain.xml

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
  <allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>

Soyez béni!

-sf

2
sacredfaith

Configuration du client

Peut-être que votre ServiceReferences.ClientConfig pour votre client Silverlight pointe vers la mauvaise URL? 

Vérifiez également l'emplacement de votre fichier de stratégie inter-domaines. Cet article MSDN contient plus d'informations.

Exécuter localement Silverlight

Remarque supplémentaire pour exécuter Silverlight localement (barre latérale Vista, par exemple). Comme indiqué dans cette entrée de blog , "Silverlight ne peut utiliser aucun fournisseur de réseau, lorsqu'il est exécuté localement". La solution consiste à utiliser javascript pour interfacer le service Web dans cette situation.

2
Jeff Yates

Vous devez être conscient de la situation dans laquelle le fichier "Reference.ClienConfig" sera créé lorsque vous vous référerez à votre service dans votre projet. Il y a:

    **

<endpoint address="http://localhost:57675/Servis.asmx" binding="basicHttpBinding"
            bindingConfiguration="ServisSoap" contract="ServiceReference1.ServisSoap"
            name="ServisSoap" />

**

Assurez-vous que votre page utilise toujours le même port (par exemple, 57675). Par défaut, votre hôte local aura un port aléatoire, vous devez donc le changer pour qu'il soit un nombre statique et non dynamique. (Faites un clic droit sur le projet asp.net/Onglet Web/Numéro de port/type spécifique J'espère que cela vous aidera

1
Avicena00

Avez-vous essayé fiddler lorsque vous utilisez cela via IE, vous pouvez peut-être voir le trafic que cause Silverlight, tel que les fichiers de règles croisées qu’il recherche?

1
meandmycode

J'ai modifié mes paramètres Internet Explorer. Le site Web étant exécuté sur un serveur Web interne, je l'ai donc ajouté à la liste des sites de confiance d'Iexplorer. (Outils-> Options Internet-> Sécurité-> Sites).

Ensuite, j'ai changé le niveau de sécurité et activé plusieurs domaines. Fait, fonctionne mais m'a pris le temps de trouver la solution.

Mieux, Jeppen

1
Jeppen

Le problème peut être que votre serveur de développement n'est pas en mesure de servir le fichier XML. Essayez ceci: rendez-le explicitement disponible via WebGet.

[ServiceContract]
    public interface ICrossDomainService
    {
        [OperationContract]
        [WebGet(UriTemplate = "ClientAccessPolicy.xml")]
        Message ProvidePolicyFile();
    }

puis le ProvidePolicyFile () peut être

public System.ServiceModel.Channels.Message ProvidePolicyFile()
        {
            FileStream filestream = File.Open(@"ClientAcessPolicy.xml", FileMode.Open);
            // Either specify ClientAcessPolicy.xml file path properly
            // or put that in \Bin folder of the console application
            XmlReader reader = XmlReader.Create(filestream);
            System.ServiceModel.Channels.Message result = Message.CreateMessage(MessageVersion.None, "", reader);
            return result;
        }
0
Nitin Chaudhari

J'ai rencontré quelque chose comme ça et l'ajout d'un ServiceHostFactory a corrigé mon problème. Le fichier de stratégie inter-domaines à lui seul ne l'a pas résolu. 

class MyHostFactory : ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        MyHost customServiceHost =
          new MyHost(serviceType, new Uri("[Your URL goes here]",UriKind.Absolute));

        return customServiceHost;
    }
}

class MyHost : ServiceHost
{
    public MyHost(Type serviceType, params Uri[] baseAddresses)   base(serviceType, baseAddresses)
    { }

    protected override void ApplyConfiguration()
    {
        base.ApplyConfiguration();
    }
}

Vous devez également ajouter Factory = "MyHostFactory" dans la balise qui définit votre service.

0
ScottG

Cela a fonctionné dans mon pc avec succès, vous pouvez placer votre 

clientaccesspolicy.xml

<?xml version="1.0" encoding="utf-8"?> <access-policy>  
  <cross-domain-access>
     <policy>
       <allow-from http-request-headers="*">
         <domain uri="*"/>
       </allow-from>
       <grant-to>
         <resource path="/" include-subpaths="true"/>
       </grant-to>
     </policy>
   </cross-domain-access> 
</access-policy>

votre répertoire de projet et votre racine de services Web.

Je faisais face au même problème et prends plus de 3 jours pour comprendre le problème. J'ai également remarqué que lorsque j'appelais le service Web Cloud WCF depuis une application Silverlight hébergée sur un autre serveur Web, il ne faisait qu'indiquer des erreurs inter-domaines. -domain.xml et clientaccesspolice.xml dans le répertoire racine du service. Je tente donc d'utiliser plutôt que http://example.com je le modifie simplement pour sécuriser https: //. example.com et cela a bien fonctionné. Les erreurs inter-domaines disparaissent. le service a été appelé sans problèmes.

0
jose lopes