.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はこれをボックスの外でサポートしますか?)。
これを試してみましょう。迅速な対応に感謝します。きちんとした解決策かもしれません - 私たちがエンコーディングを見なければならないということですか? XMLが、UTF8で安全な賭けと言えば、バイト配列に使用するエンコーディングですか? (私はユニコード文字を許可したいと思うでしょう) –
あなたはエンコーディングについて心配する必要はありません。シリアライザはあなたの代わりにbase64としてエンコードします。心配ない。 –