2009-05-17 26 views
1

.NETでのこの基本的な問題とこの問題の理由を示すために、私は単純なテストWebサービスを1つのメソッド(EditString)とそれを呼び出すコンシューマコンソールアプリケーションで作成しました。Webサービスの文字列内の特殊文字を処理する方法は?

彼らはなど、ファイル/新規プロジェクトを介して作成された両方の標準的なWebサービス/コンソールアプリケーションですので、私は全体のコードは表示されません - 問題のちょうど方法:

Webメソッド:

[WebMethod] 
public string EditString(string s, bool useSpecial) 
{ 
    return s + (useSpecial ? ((char)19).ToString() : ""); 
} 

[useSpecialがfalseの場合は文字列sを返します。 useSpecialがtrueの場合、それはS +のchar 19]

返し

コンソールアプリ:

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); 

[方法は、ハロー返す+ため、2番目の応答は、失敗した特殊文字(引数のためにASCIIコード19) 。】

エラーがある:

  • は、XML文書に誤りがあり(1、287)

  • 内部例外: "''は16進値0x13で、無効な文字です。行1、位置287」

言及する価値があるいくつかのポイント:ASMXファイル(例えばhttp://localhost:2065/service1.asmx)に直接閲覧、およびを通じてメソッドを実行しているとき

  • Webメソッド自体は正常に動作しますこれは(コンソールアプリケーションと同じパラメータで) - つまり、文字列hello + char 19で表示されます。

  • シリアライズされたXMLを他の方法でチェックすると、特殊文字が正しくエンコードされていることがわかります大丈夫よHICH)は

  • GOODですだから、クライアント側に問題があるようだ - .NETがプロキシクラスのコードに特殊文字

  • を処理しません生成、すなわち、これは、オブジェクトが渡されている大きなプロジェクトの一部であります文字列属性を含むWebメソッドのうち、これらは適切に動作する必要があります。すなわち、我々はクラスをde/serializeしている。

回避策の提案とその実装方法はありますか?

また、私は本当に明白な何かを完全に逃しましたか?

PS。私はCDATAタグを使用するのが得策ではありませんでした(.NETはこれをボックスの外でサポートしますか?)。

答えて

0

文字列の代わりにbyte []を使用する必要があります。

+0

これを試してみましょう。迅速な対応に感謝します。きちんとした解決策かもしれません - 私たちがエンコーディングを見なければならないということですか? XMLが、UTF8で安全な賭けと言えば、バイト配列に使用するエンコーディングですか? (私はユニコード文字を許可したいと思うでしょう) –

+0

あなたはエンコーディングについて心配する必要はありません。シリアライザはあなたの代わりにbase64としてエンコードします。心配ない。 –

0

私はあなたに役立つオプションを考えています。 char(19)の代わりにhtmlエンティティを使用してルートを取得できます。またはCDATAを使用したいと言ったように。

クリーンなソリューションを考え出すには、全体をCDATAに入れたくありません。なぜそれが.NETでサポートされないかもしれないと思うかわかりません。シリアライゼーションの文脈でこれを言っていますか?

+0

はい、シリアル化のコンテキストでは、.NET Webサービス/およびプロキシクラスの背後で処理されます。私は本当に私の手を汚している(または必要があると思う)直列化を望んでいなかったし、文字列の周りにCDATAタグをシリアル化するために使うことができるxml属性があるだろう...データは特殊文字を含むことが知られているウェブサイト用のデータベースからの商品説明で、私のWebサービスで処理してほしい。 (この例はちょうど余分な魔法を使わずに.NETが落ちるのを示しています...) –

+0

htmlエンティティのルートを使ってみましたか?あなたがこれらの多くを狩る必要がある場合、それは複雑になることができます。 –

関連する問題