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"))
);
}
}
}