Salut à tous ceux qui lisent ces lignes !
Voilà, je découvre tout doucement la technologie WCF qui j'avoue est un poil supérieur à celle des web services classiques et autant créer un service web classique (un client appelle et exécute des fonctions sur le service), autant je n'arrive pas à créer un service en duplex (le client peut exécuter des méthodes du service et le service des méthodes du client) ou bien à correctement configurer le client.
Pour mon test j'ai créé un client et service en duplex. Le client appelle une méthode sur le service qui elle-même appelle une méthode sur le client (pour vérifier que l'aller comme le retour fonctionne).
Le souci c'est que j'ai un timeout au moment où le service souhaite executer la méthode sur le client.
Et si vous êtes déterminé à me répondre, voilà l'interface et celle du callback, le service qui l'implémente et le fichier de conf du service :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 namespace DuplexServer { [ServiceContract(CallbackContract = typeof(IClientCallbackContract))] public interface IServerContract { [OperationContract] void SayHelloFromServer(); } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 namespace DuplexServer { [ServiceContract] interface IClientCallbackContract { [OperationContract] void ReceiveHello(); } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 namespace DuplexServer { [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Reentrant)] public class ServerTest : IServerContract { public void SayHelloFromServer() { IClientCallbackContract Client = OperationContext.Current.GetCallbackChannel<IClientCallbackContract>(); Client.ReceiveHello(); } } }Et maintenant le côté client (oui je sais ça fait un long post désolé...) :
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 <?xml version="1.0"?> <configuration> <system.web> <compilation debug="true" targetFramework="4.0" /> </system.web> <system.serviceModel> <services> <service name="DuplexServer.ServerTest"> <endpoint binding="wsDualHttpBinding" bindingConfiguration="" name="WsDualHttpBinding" contract="DuplexServer.IServerContract" /> </service> </services> <behaviors> <serviceBehaviors> <behavior> <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above 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> <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> </system.serviceModel> <system.webServer> <modules runAllManagedModulesForAllRequests="true"/> </system.webServer> </configuration>
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 namespace DuplexClient { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window, IServerContractCallback { DuplexClient.ServiceReference1.ServerContractClient service = null; public MainWindow() { InitializeComponent(); service = new ServerContractClient(new System.ServiceModel.InstanceContext(this)); } private void button1_Click(object sender, RoutedEventArgs e) { service.SayHelloFromServer(); } public void ReceiveHello() { MessageBox.Show("Message déclanché par le serveur"); } } }Je précise que j'ai générer les fichier de conf via WCF configuration editor, qui celà dit, semble très bien marcher...
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 <?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <bindings> <wsDualHttpBinding> <binding name="WsDualHttpBinding" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:01:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"> <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> <reliableSession ordered="true" inactivityTimeout="00:01:00" /> <security mode="Message"> <message clientCredentialType="Windows" negotiateServiceCredential="true" algorithmSuite="Default" /> </security> </binding> </wsDualHttpBinding> </bindings> <client> <endpoint address="http://localhost:3284/ServerTest.svc" binding="wsDualHttpBinding" bindingConfiguration="WsDualHttpBinding" contract="ServiceReference1.IServerContract" name="WsDualHttpBinding"> <identity> <userPrincipalName value="jmauperi@corp.capgemini.com" /> </identity> </endpoint> </client> </system.serviceModel> </configuration>
Merci d'avance à tous ceux qui pourront m'aider, j'ai encore pas mal de difficultés à configurer ces web services (ConcurrencyMode, InstanceContextMode, c'est encore obscure un peu pour moi :p...)
Partager