EDIT : Le problème était bien du à un problème de Namespace entre les objets de mon service WCF et les objets venant de CRM Dynamics.


Bonjour à tous,

Je ne suis pas un grand habitué des forums, cependant je me retrouve confronté à un problème assez délicat.

Le contexte de mon projet est composé d'une application Windows 8, laquelle consomme un service WCF, qui lui même fait appel à un service WCF Dynamics CRM 2011.

Mon service WCF est un service générique permettant à terme d'être connecté à n'importe quel type de CRM (SAP, Dynamics...) en exposant des objets génériques simples Customer, Order... Ce service permet donc de convertir les objets provenant d'un CRM en objet standard.

Lorsque j'apelle mon service WCF via une application console, un site web... Tout fonctionne bien. Par contre dans une application Windows 8 celui-ci me renvoit des objets qui sont toujours NULL.

En supprimant le lien entre mon service WCF et Dynamics, en contruisant un objet à la main (un fake), cela fonctionne. Il s'agit vraiment d'un problème lié à l'appel d'un service WCF dans un service WCF. J'ai vérifié la configuration des centaines de fois et tester des solutions tel que la déclaration des namespaces : http://www.codeproject.com/Articles/...Web-Service-re... en vain

Je pense que cela est lié au nouveau principe d'asynchronisme dans Windows 8 ou à la désérialisation de la réponse côté Windows 8. Auriez-vous une idée à laquelle je n'aurai pas encore pensé ?

Extrait de code :

Voici un exemple l'implémentation des méthodes liées au Customer

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
 
/// <summary>
        /// Permet de récupérer un client à partir de son Login/Mot de passe
        /// </summary>
        /// <param name="login">Login du client</param>
        /// <param name="password">Mot de passe du client</param>
        /// <returns>Le client correspondant, null sinon</returns>
        public Customer GetCustomerByAuthentification(string login, string password)
        {
            return this.GetCustomer(c => c.it_contlogin == login && c.it_contpassword == password);  
        }
 
        /// <summary>
        /// Permet de récupérer un client à partir de son nom et prénom
        /// </summary>
        /// <param name="firstname">Prénom du client</param>
        /// <param name="lastname">Nom du client</param>
        /// <returns>Le client correspondant, null sinon</returns>
        public Customer GetCustomerByName(string firstname, string lastname)
        {
            return this.GetCustomer(c => c.FirstName == firstname && c.LastName == lastname);
        }
 
        /// <summary>
        /// Permet de récupérer un client à partir de son numéro de carte de fidélité
        /// </summary>
        /// <param name="fidelity">Numéro de carte de fidélité du client</param>
        /// <returns>Le client correspondant, null sinon</returns>
        public Customer GetCustomerByFidelityCardNumber(string fidelity)
        {
            return this.GetCustomer(c => c.it_contfidelity == fidelity);
        }
 
        /// <summary>
        /// Permet de récupérer un Customer à partir d'une condition
        /// </summary>
        /// <param name="predicate">Condition (Expression Lambda)</param>
        /// <returns>Le Customer répondant à la condition, null sinon</returns>
        private Customer GetCustomer(Func<Contact, bool> predicate)
        {
            try
            {
                var xrm = new XrmServiceContext("Xrm");
                var customer = xrm.ContactSet
                    .Where(predicate).First();
                xrm.Dispose();
                //Contact customer = new Contact();
 
                if (customer != null)
                {
                    DynamicsContactAdapter adapter = new DynamicsContactAdapter();
                    return adapter.ConvertToCustomerObject(customer);
                }
                return null;
            }
            catch (Exception)
            {
                return null;
            }
        }
C'est en commentant la partie qui appelle le service Dynamics :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
var xrm = new XrmServiceContext("Xrm");
                var customer = xrm.ContactSet
                    .Where(predicate).First();
                xrm.Dispose();
et en remplacant par la construction d'un objet Customer en dur que çà fonctionne.

Voici un extrait de la configuration de mon serivce WCF :

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
 
<behaviors>
      <endpointBehaviors>
        <behavior name="webHttpBinding">
          <webHttp automaticFormatSelectionEnabled="true" defaultBodyStyle="Bare"
                   defaultOutgoingResponseFormat="Json" faultExceptionEnabled="true" helpEnabled="true" />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <bindings>
      <wsHttpBinding>
        <binding name="wsHttpBinding">
          <security mode="None">
            <transport clientCredentialType="None" />
            <message establishSecurityContext="false" />
          </security>
        </binding>
      </wsHttpBinding>
      <basicHttpBinding>
        <binding name="basicHttpBinding">
          <security mode="None" />
        </binding>
      </basicHttpBinding>
      <webHttpBinding>
        <binding name="webHttpBinding">
          <security mode="None" />
        </binding>
      </webHttpBinding>
      <netHttpBinding>
        <binding name="netHttpBinding">
          <security mode="None" />
        </binding>
      </netHttpBinding>
    </bindings>
    <services>
      <service name="Itelios.Crm.Service.API.DynamicsService">
        <endpoint name="SoapEndPoint" bindingConfiguration="netHttpBinding"
                  binding="netHttpBinding" contract="Itelios.Crm.Business.Dynamics.IDynamicsConnector" />
        <endpoint name="RestEndpoint" behaviorConfiguration="webHttpBinding"
                  binding="webHttpBinding" address="REST" contract="Itelios.Crm.Business.Dynamics.IDynamicsConnector" />
      </service>
    </services>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <directoryBrowse enabled="true"/>
  </system.webServer>
Merci d'avance pour vos pistes