Pour montrer ce problème fondamental dans .NET et la raison de cette question, j'ai écrit un service web de test simple avec une méthode (EditString), et une application de console de consommateur qui l'appelle.comment gérer les caractères spéciaux dans les chaînes d'un service Web?
Ils sont à la fois des applications de service Web standard/console créé via Fichier/Nouveau projet, etc., je ne vais pas énumérer tout le code - seulement les méthodes en question:
méthode Web:
[WebMethod]
public string EditString(string s, bool useSpecial)
{
return s + (useSpecial ? ((char)19).ToString() : "");
}
[Vous pouvez le voir renvoie simplement la chaîne s si useSpecial est false. Si useSpecial est vrai, il retourne s + charbon 19.]
application Console:
TestService.Service1 service = new SCTestConsumer.TestService.Service1();
string response1 = service.EditString("hello", false);
Console.WriteLine(response1);
string response2 = service.EditString("hello", true); // fails!
Console.WriteLine(response2);
[La deuxième réponse échoue, parce que la méthode retourne bonjour + un caractère spécial (code ascii 19 pour l'amour de l'argument) .]
L'erreur est:
Il y a une erreur dans le document XML (1, 287)
Exception interne: "'', valeur hexadécimale 0x13, est un caractère non valide. Ligne 1, 287. »
quelques points à noter:
La méthode Web lui-même fonctionne très bien lorsque vous naviguez directement dans le fichier ASMX (par exemple
http://localhost:2065/service1.asmx
), et exécution de la méthode par ceci (avec les mêmes paramètres que dans l'application console) - ie affiche XML avec la chaîne hello + char 19.La vérification du XML sérialisé par d'autres moyens montre que le caractère spécial est codé correctement (le SERVER SIDE semble sois ok UEL est bonne)
Il semble que le côté client a la question - à savoir le code de classe proxy généré .NET ne gère pas les caractères spéciaux
Cela fait partie d'un projet plus vaste où les objets sont passés dans et hors des méthodes Web - qui contiennent des attributs de chaîne - ce sont ce qui doivent fonctionner correctement. c'est-à-dire que nous sommes des/séries de sérialisation.
Des suggestions pour une solution de contournement et comment l'implémenter?
Ou ai-je complètement manqué quelque chose de vraiment évident !!?
PS. Je n'ai pas eu beaucoup de chance de l'utiliser avec des tags CDATA (est-ce que .NET les supporte déjà?).
Fera un essai, et merci pour la réponse rapide! Pourrait être une solution soignée - signifie simplement que nous devons regarder l'encodage? Si le XML est en soi UTF8 - pari sûr c'est le codage à utiliser pour le tableau d'octets? (Je voudrais autoriser les caractères Unicode.) –
Vous n'avez pas à vous soucier de l'encodage. Le sérialiseur l'encodera en base64 en votre nom. Pas de soucis. –