En utilisant conjointement SilverLight et WCF, il est très pratique d’utiliser le générateur de proxy fourni dans Visual Studio. Oui mais voilà, si on change le Binding côté service, il faut aussi le faire côté proxy. Et donc changer continuellement les fichiers de configuration. Côté serveur généralement cela ne pose pas de souci car on prend vite l’habitude d’avoir un fichier de configuration de production et un second de test pour Visual Studio. Ce qui donne souvent un code de ce genre. (2 endpoint sur 2 url et donc 2 bindings différents)
<system.serviceModel> <bindings > <basicHttpBinding > <binding name="BindingHttps"> <security mode="Transport"/> </binding> </basicHttpBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="TestSilverlight.Web.MonServiceBehavior"> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> </behaviors> <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> <services> <service behaviorConfiguration="TestSilverlight.Web.MonServiceBehavior" name="TestSilverlight.Web.MonService"> <endpoint name="http" binding="basicHttpBinding" contract="TestSilverlight.Web.MonService" address="http://localhost:50000/MonService.svc" /> <endpoint name="https" binding="basicHttpBinding" contract="TestSilverlight.Web.MonService" address="https//www.mondomainedeproduction.com/MonService.svc" bindingName="BindingHttps" /> <!--<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>--> </service> </services> </system.serviceModel>
Oui mai côté client,… et bien il suffit de faire l’instanciation du proxy et donc du binding via le code ;)
En gros voici l’astuce : on fait un petit test sur 'l’uri mettant à disposition notre application SilverLight.
Vb
Imports System Imports System.ServiceModel Imports System.ServiceModel.Channels Public Class MonService Public Shared Property Instance As TestSilverlight.MonProxy.MonServiceClient Get ' Recherche de l'uri du service Dim uri As String = System.Windows.Browser.HtmlPage.Document.DocumentUri.AbsoluteUri _ .Substring(0, System.Windows.Browser.HtmlPage.Document.DocumentUri.AbsoluteUri.LastIndexOf("/") + 1) Dim binding As new BasicHttpBinding() If uri.Contains("https://") Then binding.Security.Mode = BasicHttpSecurityMode.Transport End If return new TestSilverlight.MonProxy.MonServiceClient( _ binding, _ new EndpointAddress( _ String.Concat( _ uri, _ "MonService.svc"))) End Get End Property End Class
C#
using System; using System.ServiceModel; using System.ServiceModel.Channels; public static class MonService { public static TestSilverlight.MonProxy.MonServiceClient Instance { get { // Recherche de l'uri du service String uri = System.Windows.Browser.HtmlPage.Document.DocumentUri.AbsoluteUri .Substring(0, System.Windows.Browser.HtmlPage.Document.DocumentUri.AbsoluteUri.LastIndexOf('/') + 1); BasicHttpBinding binding = new BasicHttpBinding(); if (uri.Contains("https://")) { binding.Security.Mode = BasicHttpSecurityMode.Transport; } BasicHttpBinding binding = new BasicHttpBinding(); if (System.Windows.Browser.HtmlPage.Document.DocumentUri.AbsoluteUri.Contains("https://")) { binding.Security.Mode = BasicHttpSecurityMode.Transport; } return new TestSilverlight.MonProxy.MonServiceClient( binding, new EndpointAddress( String.Concat( uri, "MonService.svc")) ); } } }