2010-10-10 3 views
2

Je rencontre des problèmes lors de la réception de caractères non-ascii incorrects provenant d'un client Delphi 7 qui envoie un code XML encodé en utf-8 à un paramètre C# WebService dans un String. Avec un client .Net, les caractères sont reçus sans problème. J'ai essayé beaucoup de choses, et rien ne semblait fonctionner, j'ai donc décidé de suivre la conversation SOAP avec Wireshark. Avec le client .Net, XML pour l'enveloppe SOAP est utf-8 codé comme suit:Soap Envelope Header dans Delphi 7 n'inclut pas l'encodage utf-8. Comment puis-je le modifier?

POST //TesteService/ServicoAgente.asmx HTTP/1.1 
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.3615) 
Content-Type: text/xml; charset=utf-8 
SOAPAction: "http://example.com/ValidarTransacao" 
Host: 192.168.254.2 
Content-Length: 1530 
Expect: 100-continue 
Connection: Keep-Alive 

HTTP/1.1 100 Continue 

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body> ..... 

Cependant, avec l'en-tête SOAP Delphi 7, la tête de codage ne sont pas inclus, comme suit:

POST /TesteService/ServicoAgente.asmx HTTP/1.1 
SOAPAction: "http://example.com/ValidarTransacao" 
Content-Type: text/xml 
User-Agent: Borland SOAP 1.2 
Host: 192.168.254.1 
Content-Length: 1548 
Connection: Keep-Alive 
Cache-Control: no-cache 

<?xml version="1.0"?> 

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><SOAP-ENV:Body> ..... 

Inclus dans le corps SOAP, un paramètre XML avec des caractères non-ascii qui apparaît comme ?? à l'intérieur du service Web C# après avoir reçu la méthode du client Delphi, et cela me semble la seule explication logique. Quand je vérifie le XML dans Delphi juste avant de l'envoyer, il est parfaitement encodé mais, à la réception, je reçois ??
Sur l'unité importée en utilisant l'importateur WSDL, il spécifie utf-8, comme vous pouvez le voir ci-dessous:

initialization 
    InvRegistry.RegisterInterface(TypeInfo(TesteAgentSoap), 'http://example.com/', 'utf-8'); 
    InvRegistry.RegisterDefaultSOAPAction(TypeInfo(TesteAgentSoap), 'http://example.com/%operationName%'); 
    InvRegistry.RegisterInvokeOptions(TypeInfo(TesteAgentSoap), [ioDefault, ioDocument, ioHasReturnParamNames, ioHasNamespace]); 

end. 

Que puis-je faire pour changer l'encodage du XML pour l'enveloppe SOAP? Des idées quoi d'autre pourrait être faux? Il me semble logique que, si le XML pour l'enveloppe SOAP n'est pas correctement encodé en utf-8, alors mon XML dans ce XML ne sera pas lu correctement
Tks tellement pour votre temps

Répondre

3

Si vous utilisez HTTPRio/HTTPWebNode peut-être cette aide:

  • ensemble HTTPRIO.Converter.Options.soUTF8InHeader True
  • ensemble HTTPWebNode.UseUTF8InHeader True

(trouvé here)

+0

Vous êtes génial! J'ai regardé partout! Tks tellement – Pascal

0

Si je comprends bien vous avez correctement essayé de comprendre comment ajouter la chaîne utf-8 à votre enveloppe SOAP? J'ai bien peur que je ne pense pas que ce soit si simple (mais pour être sûr que vous pourriez changer beaucoup de flux de savon XML et le tester). Delphi avant Delphi 2009 n'était pas compatible avec Unicode et n'encodait donc pas les éléments sortis comme UTF-8 puisque delphi lui-même ne l'était pas. Certains caractères européens peuvent être représentés à l'intérieur de delphi mais en dehors de cela, n'importe qui peut le deviner.

Votre meilleur pari est de mettre à jour à une version de Delphi qui est Unicode conforme ou si ce n'est pas possible utiliser une bibliothèque Delphi Unicode comme TNT.

+0

Toby, même si j'utilise seulement WideStrings pour la manipulation de chaînes? – Pascal

+0

Delphi 6 (ou même 5) a une fonction Utf8Encode. Les vieilles versions de Delphi ne sont pas si mauvaises :) – mjn

+0

Si jamais il passe par une fonction delphi non-unicode, vous perdrez toutes les informations, c'est possible mais un peu risqué. –

Questions connexes