1

.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 はすぐに使用できますか?)。

4

2 に答える 2

0

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

于 2009-05-17T17:56:19.900 に答える
0

私はあなたを助けるかもしれないいくつかのオプションを考えています. char(19) の代わりに html エンティティを使用してルートを取ることができます。またはあなたが言ったように、CDATAを使いたいかもしれません。

クリーンなソリューションを考え出すために、すべてを CDATA に入れたくない場合があります。.NET でサポートされていない可能性があると思われる理由がわかりません。連載の文脈で言ってるの?

于 2009-05-17T19:24:49.007 に答える