Blog de Julien Dollon (MVP)

Consultant / Formateur .NET

Julien Dollon

Consultant/formateur .NET pour I'FORM/Exakis et Full Professor SUPINFO.

Responsable de la communauté Dotnet-France ainsi que nommé Most Valuable Professional, je participe activement à la communauté Microsoft.

 

 

Mon CV de Consultant/Formateur .NET

Mon Transcript de Formateur .NET

 


 
 
 
 
Official INETA Logo
 
IForm

[Azure] Silverlight 3 & .NET Services

Comme expliqué dans mon article sur Azure, .NET Services permet de faire abstraction de tous les problèmes de firewall/dmz et autre joyeusetés !

Il se trouve que la consommation de service WCF “on the cloud” grâce à .NET Services fonctionne correctement excepté en Silverlight ou j’ai eu quelques petits problèmes.

Voici comment faire communiquer un service (Service echo du SDK) WCF utilisant .NET Services et Silverlight 2/3.

Télécharger la source de ce poste ici.

  • Création du contrat

Le contrat contient une simple méthode Echo qui retourne ce qu’on lui passe en paramêtre.

    [ServiceContract(Name = "IEchoContract", Namespace = "http://samples.microsoft.com/ServiceModel/Relay/")]
    public interface IEchoContract
    {
        [OperationContract]
        string Echo(string text);
    }

    public interface IEchoChannel : IEchoContract, IClientChannel { }
  • Création d’un second contrat permettant d’exposer le clientaccesspolicy.xml
    [ServiceContract]
    public interface IPolicyRetriever
    {
        [OperationContract, WebGet(UriTemplate = "/clientaccesspolicy.xml")]
        Stream GetSilverlightPolicy();
    }
  • Implémentation des deux contrats

[ServiceBehavior(Name = "EchoService", Namespace = "http://samples.microsoft.com/ServiceModel/Relay/")]
    class EchoService : IEchoContract, IPolicyRetriever
    {
        public string Echo(string text)
        {
            Console.WriteLine("Echoing: {0}", text);
            return text;            
        }

        #region IEchoContract Members

     

        #endregion

        Stream StringToStream(string result)
        {
            WebOperationContext.Current.OutgoingResponse.ContentType = "application/xml";
            return new MemoryStream(Encoding.UTF8.GetBytes(result));
        }

        public Stream GetSilverlightPolicy()
        {
            string result = @"<?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>";
            return StringToStream(result);
        }
    }

  • Hébergement de votre service (n’oubliez pas d’inclure le SDK Helper)
	    ServiceBusEnvironment.SystemConnectivity.Mode = GetConnectivityMode(args);

            string solutionName = "juliendblog";
            string solutionPassword = "mdp";

            Uri address = ServiceBusEnvironment.CreateServiceUri("http", solutionName, "EchoService");

            TransportClientEndpointBehavior userNamePasswordServiceBusCredential = new TransportClientEndpointBehavior();
            userNamePasswordServiceBusCredential.CredentialType = TransportClientCredentialType.UserNamePassword;
            userNamePasswordServiceBusCredential.Credentials.UserName.UserName = solutionName;
            userNamePasswordServiceBusCredential.Credentials.UserName.Password = solutionPassword;

            ServiceHost host = new ServiceHost(typeof(EchoService));

            foreach (ServiceEndpoint endpoint in host.Description.Endpoints)
                endpoint.Behaviors.Add(userNamePasswordServiceBusCredential);

            host.Open();

            Console.WriteLine("Service address: " + address);
            Console.WriteLine("Press [Enter] to exit");
            Console.ReadLine();

            host.Close();
  • Désactivation des credentials car Silverlight ne les supporte pas

On le fait à la fois pour basicHttpRelayBinding pour que Silverlight le consomme mais aussi avec webHttpRelayBinding afin d’exposer le clientaccesspolicy

 <bindings>
      <basicHttpRelayBinding>
        <binding name="default">
          <security mode="None" relayClientAuthenticationType="None"/>
        </binding>
      </basicHttpRelayBinding>
      <webHttpRelayBinding>
        <binding name="default2">
          <security relayClientAuthenticationType="None"/>
        </binding>
      </webHttpRelayBinding>
    </bindings>

  • Exposition du service
 <service name="Microsoft.ServiceBus.Samples.EchoService" behaviorConfiguration="Metadata">
        <host>
          <baseAddresses>
            <add baseAddress="http://juliendblog.servicebus.windows.net"/>
          </baseAddresses>
        </host>
        <endpoint contract="Microsoft.ServiceBus.Samples.IEchoContract" address="EchoService"
                  binding="basicHttpRelayBinding" bindingConfiguration="default" />
        <endpoint address=""
                  binding="webHttpRelayBinding"
                  contract="Microsoft.ServiceBus.Samples.IPolicyRetriever"
                  bindingConfiguration="default2" behaviorConfiguration="webHttpBehaviour" />
      </service>
  • Ajout d’un behavior (mettre votre adresse locale) afin de pouvoir générer le proxy Silverlight (merci à maxime boennec pour le tuyaux)
 <behaviors>
      <serviceBehaviors>
        <behavior name="Metadata">
          <serviceMetadata httpGetEnabled="true" httpGetUrl="http://Julien-PC:1234/ServiceMeta" />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="webHttpBehaviour">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
  • Puis consommation du service en Silverlight (Add service reference sur l’adresse locale décrite dans le serviceMedata)
Posted: Jun 02 2009, 23:52 by juliend | Comments (6) RSS comment feed |
  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Filed under: WPF/Silverlight | Azure | Général | .NET

Comments

bastou said:

salut,
le lien de la source est mort :/.
pourrait tu le mettre à jour? ça m'aiderais grandement.

merci

# August 11 2009, 21:19

Julien Dollon said:

Réessaie car chez moi ça marche nickel !

# August 11 2009, 22:35

nk54 said:

salut julien. Actuellement j'ai une application silverlight 3 qui utilise un service WCF pour communiquer avec ma base de données.

Pour tester mon appli sur mon serveur de dév, je dois changer l'adresse de ma référence de web service.
au lieu de http://localhost/services/WCF_Services.svc

(wcf est le dossier contenant le projet en entier)
j'ai http://monsite.fr/wcf/services/WCF_Services.svc.

Le service est visible lorsque je tape :
http://192.168.1.3:84/wcf/services/WCF_Services.svc

Mais lorsque je fais les même manipulations pour le placer sur une DMZ, je ne vois pas le service et j'ai toujours l'erreur :
Erreur du serveur dans l'application '/'. (le message qui dit customerror="off" ou "remoteOnly". Tu dois sûrement voir de quoi je parle, qui n'a jamais eu cette erreur Smile

Pourtant d'après ton billet, les DMZ ne posent pas de problèmes.

Et aussi, est-ce normal que sur le serveur de dev,
avec une architecture comme ceci :

/AppliSilverlight

/AppliWeb/web.config

/WCF/Services/wcf_services.svc
/WCF/web.config

Si je laisse le fichier web.config dans le dossier wcf, cela ne marche pas : le service n'est pas visible et me dis que servicehost est mal renseigné.

En attendant de trouver une solution viable, j'ai du insérer une référence au service dans le projet AppliWeb pour avoir les DLL dans le fichier bin.

Si tu as déjà rencontré ce genre de problème, je suis preneur car je commence à bloquer ! Cry

Merci

# August 28 2009, 01:36

Julien Dollon said:

Salut NK,
C'est une erreur trop spécifique pour que je t'aide. Il faudrait que je soit en face de ton PC Smile
Par contre ce que je peux te dire c'est que quand je parle que les DMZ ne pose pas de pb ce n'est pas en utilisant QUE WCF mais .NET Services également.
Renseigne toi sur .NET Services tu auras surement la réponse à tes questions.
A+

# August 28 2009, 02:01

Jean-Marie Stawikowski said:

Bonjour Julien

si j'utlise "Silverlight 3 & .NET Services Bus" comme tu nous la présenté et par le fait que ".NET Services Bus" optimise les connections voir

http://sites.google.com/site/jmstawikowski/azure/service-bus-infographic_lg.gif?attredirects=0" rel="nofollow">sites.google.com/.../...ice-bus-infographic_lg.gif

http://sites.google.com/site/jmstawikowski/azure

est ce que cela va donc économiser du cout de location sur Azure si je fait des communications directe entre une apllication #1 en Silverlight via ".NET Services Bus" pour atteindre une apllication #2 dans mon intranet voir:

www.microsoft.com/.../...ce-bus-infographic_lg.gif

www.microsoft.com/windowsazure/dotnetservices/

Merci
Jean-Marie


# November 07 2009, 20:52

juliend said:

Je ne pense pas qu'on parle d'économiser quoi que ce soit mais plus de ne pas être limité par le réseau physique/logique.
Après peut être que mes connaissances d'Azure ne sont pas assez poussées ;)

# November 10 2009, 00:58

Add comment




  Country flag

biuquote
  • Comment
  • Preview
Loading

captcha

*