1

SOAP 経由で Web サービスから XML ファイルをダウンロードする C# クライアントに取り組んでいます。サービスでホストされている一部の古いレコードでは、XML のどこかに 0x14 が埋め込まれているようで、「無効な空白文字」例外が発生します。Linq を使用して XML をファイルにダンプしています。XML の残りの部分を失うことなく無効な文字を破棄するよう Linq に指示する方法はありますか?

編集:

XMLをファイルに入れるために現在持っているコードは次のとおりです。

 XDocument c =
            new XDocument(
                new XElement(nameSpace + "getCitationsResponse",
                    new XAttribute(XNamespace.Xmlns + "ns1", nameSpace),
                    new XElement("list",
                        record.reportDateSpecified ? new XElement("reportDate", record.reportDate) : null,
                        new XElement("reportType", record.reportType),
                        new XElement("title", record.title),
                        new XElement("projectNumber", record.projectNumber),
                        new XElement("author", record.author),
                        new XElement("abstract", record.@abstract),
                        new XElement("numPages", record.numPages),
                        record.isDataTypeSpecified ? new XElement("isDataType", record.isRestrictedData) : null,
                        new XElement("comments", record.comments),
                        new XElement("attachments", from a in record.attachments
                                                    select new XElement("list",
                                                        new XElement("id", a.id),
                                                        new XElement("filePath", a.filePath),
                                                        new XElement("type", a.type)))));

通常の理由で一部をハッキングする必要がありましたが、削除したものはここに表示されているものと同じです.

投稿する前に SoapUI を使用して、欠陥がどこにあるかを把握できるかどうかを確認しましたが、SoapUI には何も表示されず、エラー自体も生成されません。

編集#2:

正確なエラー メッセージとスタック トレースを次に示します。実際にそれについて何かできるのか、それとも、どのレコードに無効な文字が含まれているかをログに記録し、SoapUI を使用して手動でプルダウンする必要があるだけなのか、疑問に思います。

Invalid white space character (0x14) in text to output
   at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
   at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
   at Downloader.WebService.ApiService.getRecords(String username, String[] ids)
   at Downloader.Central.RecordLoop(ApiService svc, Int32 offset, String username)

getRecords は、wsdl によって生成された API 呼び出しです。RecordLoop は、更新されたレコードを見つけて、既に投稿した Linq 関数にプッシュする API 呼び出しの反復処理を処理するために作成した再帰関数です。

4

1 に答える 1

0

上記のコメントのいくつかで述べたように、さまざまな忍者のトリックを実行して、XML 仕様に準拠する SOAP 応答を取得することが可能です。

応答を変更して有効な XML にする場合は、変更によって応答の意味が変わるかどうかを真剣に検討する必要があります。

私が見たところ、問題はあなた側ではなく、サービス側にあります。可能であれば、サービスの所有者にサービスをアップグレードしてもらい、Web サービスで適切な形式の XML を提供するようにしてください。

サード パーティの Web サービスを扱うときは、通常、次のことを行います。

  • 第 3 の Web サービスとの間のすべての要求と応答で、完全な XML スキーマ検証を有効にします。要求または応答が XML スキーマで有効でない場合、私たち (クライアントとサービス) には問題があり、それはマイナーまたはメジャーである可能性がありますが、少なくとも注意が必要です。

  • コンテンツの修正を試みる前に、必ずスキーマ検証エラーをログに記録して、記録されていることを確認してください。

  • コンテンツの変更に関するシステム、ビジネス、または法的な影響を完全に認識していることを確認してください。

  • 適切なエンコード形式 (UTF8、Latin1 など) を使用して応答をエンコードしていることを確認してください。

無効なコンテンツは通常、無効な XML 文字を含む xml テキスト要素です。サービス側は、XML エンコーディングまたは base64 エンコーディングのいずれかを使用して、そのようなテキスト ノードを転送し、フォーマットとコンテンツの両方を保持する必要があります。

実際にコンテンツを変更して有効にするというより技術的な部分については、通常、WCF の動作を追加します。これにより、問題に対処し、xml の修正に関する懸念とサービス呼び出しのビジネス目的を分離することができます。

サービスが更新されて任意の要求で有効な XML を提供する場合は、WCF の動作を簡単に削除することもできます。

于 2014-01-04T11:36:24.543 に答える