.NET におけるこの根本的な問題と、この質問の理由を示すために、1 つのメソッド (EditString) とそれを呼び出すコンシューマー コンソール アプリを含む簡単なテスト 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);
[メソッドが hello + 特殊文字 (引数のために ASCII コード 19) を返すため、2 番目の応答は失敗します。]
エラーは次のとおりです。
XML 文書にエラーがあります (1, 287)
内部例外: 「''、16 進値 0x13 は無効な文字です。1 行目、位置 287。」
言及する価値のあるいくつかのポイント:
Web メソッド自体は、ASMX ファイル (例:
http://localhost:2065/service1.asmx
) を直接参照し、(コンソール アプリケーションと同じパラメーターを使用して) これを介してメソッドを実行すると正常に機能します。つまり、文字列 hello + char 19 で XML が表示されます。シリアライズされた XML を他の方法でチェックすると、特殊文字が適切にエンコードされていることがわかります (サーバー側は問題ないようです)。
したがって、クライアント側に問題があるようです。つまり、.NET で生成されたプロキシ クラス コードは特殊文字を処理しません。
これは、文字列属性を含むオブジェクトが Web メソッドに出入りする、より大きなプロジェクトの一部です。これらは、適切に機能するために必要なものです。つまり、クラスをデシリアライズしています。
回避策とその実装方法に関する提案はありますか?
それとも、本当に明白なことを完全に見逃していますか!!?
PS。私は、CDATA タグを使用することにあまり運がありませんでした (.NET はすぐに使用できますか?)。