Bonjour à tous,

Je développe une application ModernUI qui consomme un service WCF. Ce dernier repose sur les Websockets. J'ai donc déployé mon service sur un IIS8, fait une découverte de service sous VS2012, et tout a fonctionné du premier coup (ce que je trouvais trop beau).

J'ai ensuite voulu déployer mon client sur une tablette W8, connectée au réseau local. Lorsque je lance mon application je me retrouve avec une SocketException qui me dit "Une tentative d’accès à un socket de manière interdite par ses autorisations d’accès a été tentée 192.168.1.41:80" (la propriété SocketErrorCode contient "AccessDenied" ). A la vue de cette erreur, j'ai tenté d'accéder à mon service via un navigateur, et je me suis bien retrouvé sur la page qui me dit que mon service a été créé et que si je veux le tester blablabla, bref, visiblement j'y ai accès mais je me fais jeter quand même.

Je suis en train de m'arracher les cheveux sur un truc qui doit être tout bête (je n'ai jamais rencontré ce genre d'erreur avec WCF auparavant... cela dit, je n'ai jamais joué avec les sockets auparavant --')

Mon web.config ressemble à ça :
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?xml version="1.0" encoding="utf-8"?>
<configuration>
 
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
 
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
 
  <system.web>
    <compilation debug="true" targetFramework="4.5">
      <assemblies>
        <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      </assemblies>
    </compilation>
    <httpRuntime targetFramework="4.5" />
  </system.web>
 
  <system.serviceModel>
    <bindings>
      <netHttpBinding>
        <binding name="NetHttpBindingConfig" maxReceivedMessageSize="2097152">
          <webSocketSettings transportUsage="WhenDuplex" />
        </binding>
      </netHttpBinding>
    </bindings>
 
    <services>
      <service name="Slm.Service.RegistrationService">
        <endpoint address="" binding="netHttpBinding" contract="Slm.Service.IRegistrationService" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
      <service name="Slm.Service.CoreService">
        <endpoint address="" binding="netHttpBinding" contract="Slm.Service.ICoreService" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
 
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 
  <connectionStrings>
    <add name="DatabaseEntities" connectionString="metadata=res://*/DataModel.csdl|res://*/DataModel.ssdl|res://*/DataModel.msl;provider=System.Data.SqlServerCe.4.0;provider connection string="data source=|DataDirectory|\Database.sdf"" providerName="System.Data.EntityClient" />
  </connectionStrings>
 
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
 
</configuration>
Et côté client :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
CoreServiceCallback = new CallbackHandler();
_context = new InstanceContext(CoreServiceCallback);
_binding = new NetHttpBinding
{
    MaxReceivedMessageSize = 1024 * 1024 * 2 // On limite la taille à deux Mo.
};
 
_channelFactory = new DuplexChannelFactory<ICoreService>(_context, _binding, new EndpointAddress("http://192.168.1.41/Slm/CoreService.svc"));
CoreServiceClient = _channelFactory.CreateChannel();
EDIT:
Après investigations, je me suis rendu compte que si je lance fiddler sur ma tablette, je n'ai plus aucun souci (l'appli se connecte bien à mon service WCF). A parti du moment où je ferme fiddler je me retrouve dans le même scénario qu'avant ; poste pingable, service découvert, mais impossible d'y accéder.

C'est à n'y rien comprendre. Si quelqu'un a un embryon d'explication je prend volontiers !