IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Communication Foundation .NET Discussion :

Silverlight WCF PollingDuplex Sercurity Error


Sujet :

Windows Communication Foundation .NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 45
    Points
    45
    Par défaut Silverlight WCF PollingDuplex Sercurity Error
    Bonjour à tous,

    Je voulais me lancer dans un projet d'application Silverlight 5 communiquant avec web service WCF en PollingDuplex mais je me heurte à une erreur. J'ai fait la démonstration présente sur le msdn (http://msdn.microsoft.com/fr-fr/libr...=vs.95%29.aspx) qui marche très bien et j'ai tenté de l'adapter à un projet personnel.

    Il en résulte l'erreur suivante.

    Dans mon ServiceReference.cs (généré automatiquement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void EndConnect(System.IAsyncResult result) {
                    object[] _args = new object[0];
                    base.EndInvoke("Connect", _args, result);
                }
    Le base.EndInvoke génère l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Une erreur s'est produite en tentant d'effectuer une demande à l'URI 'http://localhost:24942/ZombieDiceWS.svc'. Ce problème peut être dû à une tentative d'accès à un service entre domaines sans qu'une stratégie entre domaines appropriée soit en place, ou une stratégie inadaptée aux services SOAP. Il est possible que vous soyez contraint de contacter le propriétaire du service pour publier un fichier de stratégie entre domaines et veiller à ce qu'il autorise l'envoi d'en-têtes HTTP SOAP. Cette erreur peut également être liée à l'utilisation de  types internes dans le proxy de service Web sans utiliser l'attribut InternalsVisibleToAttribute. Consultez l'exception interne pour plus de détails.
    Inner Exception que voilà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    {System.Security.SecurityException: Erreur de sécurité.
       à System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)
       à System.Net.Browser.BrowserHttpWebRequest.<>c__DisplayClassa.<EndGetResponse>b__9(Object sendState)
       à System.Net.Browser.AsyncHelper.<>c__DisplayClass4.<BeginOnUI>b__0(Object sendState)}
    Mon web.config ressemble à ça pour la partie service :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    <system.serviceModel>
     
        <!--Extension rajoutée pour supporter le pollingDuplex-->
        <extensions>
          <bindingExtensions>
            <add name="pollingDuplexHttpBinding" type="System.ServiceModel.Configuration.PollingDuplexHttpBindingCollectionElement,System.ServiceModel.PollingDuplex, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
          </bindingExtensions>
        </extensions>
     
        <!--Définition des bindings-->
        <bindings>
          <pollingDuplexHttpBinding>
            <binding name="multipleMessagesPerPollPollingDuplexHttpBinding"
                     duplexMode="MultipleMessagesPerPoll"
                     maxOutputDelay="00:00:07"/>
          </pollingDuplexHttpBinding>
        </bindings>
     
        <!--Définition des services-->
        <services>
          <service name="ZombieDiceWS.ZombieDiceWS">
            <!-- Service Endpoints -->
            <endpoint
               address=""
               binding="pollingDuplexHttpBinding"
               bindingConfiguration="multipleMessagesPerPollPollingDuplexHttpBinding"
               contract="ZombieDiceWS.IZombieDiceWS">
            </endpoint>
            <endpoint
                address="mex"
                binding="mexHttpBinding"
                contract="IMetadataExchange"/>
          </service>
        </services>
     
        <!--Configuration de base, laissée car plante sans-->
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
     
        <!--Définition des comportements-->
        <behaviors>
          <serviceBehaviors>
            <behavior>
               <!--To avoid disclosing metadata information, set the value below to false before deployment--> 
              <serviceMetadata httpGetEnabled="true"/>
               <!--To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information--> 
              <serviceDebug includeExceptionDetailInFaults="false"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
    J'instancie mon webservice côté client de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     EndpointAddress address = new EndpointAddress("http://localhost:24942/ZombieDiceWS.svc");
                    PollingDuplexHttpBinding binding = new PollingDuplexHttpBinding(PollingDuplexMode.MultipleMessagesPerPoll);
                    ZombieDiceWSClient ZDService = new ZombieDiceWSClient(binding, address);
     
                    ZDService.DisplayMessageReceived += ZDService_DisplayMessageReceived;
                    ZDService.ConnectAsync("test", "test");
    Et la fonction connect côté web service ressemble à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public void Connect(string login, string password)
            {
                client = OperationContext.Current.GetCallbackChannel<IZombieDiceServiceCallback>();
                //rappel("Vous êtes connecté");
                //return Guid.NewGuid().ToString();
            }
    Rien de réellement transcendant donc. Je pensais avoir scrupuleusement suivi les indication de l'exemple msdn, mais forcé de constater que je me suis trompé quelque part.
    Quelqu'un aurait-il une idée pour me sauver de cette galère ?

    Merci infiniment d'avance !

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Le message de l'exception est très clair. Les requêtes Cross Domain ne sont pas autorisées par défaut. Il faut mettre en place une configuration particulière afin de les autoriser. Première chose à faire, rajouter un fichier clientaccesspolicy.xml à la racine du site. Attention à garder la casse en minuscule, surtout si tu utilises un serveur Linux. Voici le contenu du fichier :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0" encoding="utf-8" ?>   
    <access-policy>  
        <cross-domain-access>  
            <policy>  
                <allow-from http-request-headers="SOAPAction">  
                    <domain uri="*" />   
                </allow-from>  
                <grant-to>  
                    <resource path="/" include-subpaths="true" />   
                </grant-to>  
            </policy>  
        </cross-domain-access>  
    </access-policy>
    Le fichier tel quel autorise tout. Pour améliorer la sécurité, il vaut mieux spécifier plus précisément les requêtes qui sont autorisées.

    Une fois le fichier mis en place, vérifie avec Fiddler qu'il soit bien pris en compte, et ça devrait rouler.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 45
    Points
    45
    Par défaut
    Merci beaucoup pour la suggestion ! Je teste ça dès que possible et je fais un retour (si ça marche, ça pourra être toujours utile à d'autres).

Discussions similaires

  1. Erreur avec Silverlight + WCF sur Vista
    Par matdur dans le forum Windows Communication Foundation
    Réponses: 6
    Dernier message: 18/06/2009, 16h49
  2. [Silverlight + WCF] déploiement sur un serveur d'intégration
    Par Maximil ian dans le forum Silverlight
    Réponses: 2
    Dernier message: 26/05/2009, 10h24
  3. Silverlight WCF et windows service
    Par psion2 dans le forum Silverlight
    Réponses: 5
    Dernier message: 27/04/2009, 20h43
  4. [silverlight 2] Accross domain error
    Par almora007 dans le forum Silverlight
    Réponses: 17
    Dernier message: 19/09/2008, 10h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo