2009-05-17 5 views
1

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à?).

Répondre

0

Vous devrez utiliser byte [] à la place des chaînes.

+0

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.) –

+0

Vous n'avez pas à vous soucier de l'encodage. Le sérialiseur l'encodera en base64 en votre nom. Pas de soucis. –

0

Je pense à certaines options qui pourraient vous aider. Vous pouvez prendre la route en utilisant des entités html au lieu de char (19). ou comme vous l'avez dit, vous pouvez utiliser CDATA.

Pour trouver une solution propre, vous ne voudrez peut-être pas tout mettre en CDATA. Je ne suis pas sûr pourquoi vous pensez qu'il ne peut pas être pris en charge dans .NET. Voulez-vous dire cela dans le contexte de la sérialisation?

+0

Oui dans le contexte de la sérialisation - qui est entièrement gérée en coulisses par le service Web .NET/et la classe proxy. Je ne voulais pas vraiment me salir les mains avec (ou penser que ça devrait être nécessaire) la sérialisation et il y aurait juste un attribut xml que je pourrais utiliser pour faire en série une étiquette CDATA autour de ma chaîne ... Les données sont des descriptions de produits provenant d'une base de données pour un site Web, qui contient des caractères spéciaux, et je souhaite simplement que mon service Web s'en charge. (Cet exemple montre juste hors de la boîte .NET tombe apparemment sans sorcellerie supplémentaire ...) –

+0

avez-vous essayé d'utiliser la route des entités html? Cela peut devenir complexe si vous avez besoin d'en traquer beaucoup. –

Questions connexes