Bonjour,


Dans le cadre de l'implémentation de la sérialisation des médicaments, j'ai téléchargé un exemple d'implémentation des web services NVMS sur leur portail dédié. Le web service est de type SOAP. Dans le code source, il y a une classe interne qui implémente IEndpointBehavior et IClientMessageInspector et dans la méthode BeforeSendRequest, une fonction est censée enlever les headers, ce que montre bien le print en console effectué à ce moment là mais vu la réponse que j'obtiens, je suis sûr que la requête finale contient toujours les headers. J'ai testé les 2 requêtes (avec et sans header) dans SOAPUI, la requête sans header passe bien et l'autre me fournit le même résultat que celui que j'obtiens avec le code C#.
Voici la classe :


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
66
67
 
internal class CustomMessageInspector : IEndpointBehavior, IClientMessageInspector
    {
        public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
        {
        }
 
 
        public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
        {
            clientRuntime.MessageInspectors.Add(this);
        }
 
 
        public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
        {
        }
 
 
        public void Validate(ServiceEndpoint endpoint)
        {
        }
 
 
        /*public void BeforeSendReply(ref Message reply, object correlationState)
        {
            reply.Headers.Clear();
        }*/
 
 
        //add using directive Message = System.ServiceModel.Channels.Message;
        public void AfterReceiveReply(ref Message reply, object correlationState)
        {
            // WORKAROUND for WCF-Exception "The MessageHeader is already understood" 
            // (Note: The message still gets validated)
            reply.Headers.Clear();
            Console.WriteLine("received Response:");
            Console.WriteLine("{0}\r\n", reply);
        }
 
 
        /// <summary>
        /// Shows the sent message with and without SOAP-Header
        /// </summary>
        /// <param name="request"></param>
        /// <param name="channel"></param>
        /// <returns></returns>
        public object BeforeSendRequest(ref Message request, IClientChannel channel)
        {
            // Fait la même chose que le clear, mais ne fonctione pas non plus...
            /*request.Headers.ReplyTo = null;
            request.Headers.Action = null;
            request.Headers.MessageId = null;*/
            Console.WriteLine("original Request:");
            Console.WriteLine("{0}\r\n", request);
            // Ne semble pas fonctionner, la requête est envoyée avec les headers...
            request.Headers.Clear();
            request.Headers.
 
 
            Console.WriteLine("without Header Request:");
            Console.WriteLine("{0}\r\n", request);
 
 
            return null;
        }
    }



La ligne "request.Headers.Clear();" devrait fonctionner vu que la variable request est passée par référence. Mais voici le résultat obtenu :


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
 
received Response:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
  <s:Header xmlns:s="http://www.w3.org/2003/05/soap-envelope" />
  <soap:Body>
    <soap:Fault>
      <soap:Code>
        <soap:Value>soap:MustUnderstand</soap:Value>
      </soap:Code>
      <soap:Reason>
        <soap:Text xml:lang="en">MustUnderstand headers: [{http://www.w3.org/2005/08/addressing}To] are not understood.</soap:Text>
      </soap:Reason>
    </soap:Fault>
  </soap:Body>
</soap:Envelope>

Voici les 2 requêtes avec et sans headers, affichés via la méthode beforesendrequest :


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
66
67
68
69
 
original Request:
<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">
  <s:Header>
    <a:Action s:mustUnderstand="1">ns:G110RequestMessage</a:Action>
    <a:MessageID>urn:uuid:405c0e93-f39d-4d8b-bef8-72cf82f88203</a:MessageID>
    <a:ReplyTo>
      <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
    </a:ReplyTo>
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <G110Request xmlns="urn:wsdltypes.nmvs.eu:v3.0">
      <Header xmlns="urn:types.nmvs.eu:v3.0">
        <Auth>
          <ClientLoginId>ABC</ClientLoginId>
          <UserId>test123</UserId>
          <Password>123456</Password>
        </Auth>
        <UserSoftware d5p1:name="Test Soft" d5p1:supplier="Comp Any" d5p1:version="V2" xmlns:d5p1="urn:types.nmvs.eu:v3.0" />
        <Transaction>
          <ClientTrxId>7775559966aaa</ClientTrxId>
          <Language>eng</Language>
        </Transaction>
      </Header>
      <Body xmlns="urn:types.nmvs.eu:v3.0">
        <Product>
          <ProductCode d6p1:scheme="GTIN" xmlns:d6p1="urn:types.nmvs.eu:v3.0">PK001C854A8EE536949</ProductCode>
          <Batch>
            <Id>TESTA1596337CF</Id>
            <ExpDate>231130</ExpDate>
          </Batch>
        </Product>
        <Pack d5p1:sn="PK001C854A8EE536949" xmlns:d5p1="urn:types.nmvs.eu:v3.0" />
      </Body>
    </G110Request>
  </s:Body>
</s:Envelope>
 
 
without Header Request:
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
  <s:Header />
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <G110Request xmlns="urn:wsdltypes.nmvs.eu:v3.0">
      <Header xmlns="urn:types.nmvs.eu:v3.0">
        <Auth>
          <ClientLoginId>ABC</ClientLoginId>
          <UserId>test123</UserId>
          <Password>123456</Password>
        </Auth>
        <UserSoftware d5p1:name="Test Soft" d5p1:supplier="Comp Any" d5p1:version="V2" xmlns:d5p1="urn:types.nmvs.eu:v3.0" />
        <Transaction>
          <ClientTrxId>7775559966aaa</ClientTrxId>
          <Language>eng</Language>
        </Transaction>
      </Header>
      <Body xmlns="urn:types.nmvs.eu:v3.0">
        <Product>
          <ProductCode d6p1:scheme="GTIN" xmlns:d6p1="urn:types.nmvs.eu:v3.0">PK001C854A8EE536949</ProductCode>
          <Batch>
            <Id>TESTA1596337CF</Id>
            <ExpDate>231130</ExpDate>
          </Batch>
        </Product>
        <Pack d5p1:sn="PK001C854A8EE536949" xmlns:d5p1="urn:types.nmvs.eu:v3.0" />
      </Body>
    </G110Request>
  </s:Body>
</s:Envelope>

J'ai tenté de changer l'attribut mustUnderstand mais je ne sais pas comment faire. C'est lui qui pose problème.