私はサードパーティのWebサービスを使用しようとしています。リクエストメッセージを作成し、httpclientに送信し、httpResponseMessageを受信します。HttpResponseMessageはXMLのデシリアライズに失敗しますが、ファイルストリームは正常です。
以下は、コールを処理するメソッドのスニペットです。私の状況ではxml = true。
このコードを実行すると、ストリーム内のXMLデータを逆シリアル化しようとするとエラーがスローされます。 「ルートレベルのデータが無効です」というエラーが表示されて失敗します。
私は... XMLMediaTypeFormatterとresponse.Content.Readをコメントアウトして、ファイルへの有効なXMLを書き出したこの
var fileStream = File.Create("D:\\Extract\\test.txt");
await response.Content.CopyToAsync(fileStream);
fileStream.Close();
でそれを置き換えます。
私はresponse.Content.ReadAsStringAsync()を実行し、返された文字列値にはコンテンツをエスケープする余分なバックスラッシュがあります。私は、これは失敗し、逆シリアル化を引き起こしているものであると信じてい
<?xml version=\"1.0\" encoding=\"utf-8\"?>
:
<?xml version="1.0" encoding="utf-8"?>
と、これはReadAsStringAsyncからである:
は例えば、これは、生成されたTest.txtファイルには何かということです。これに対してクリーンな修正があるのでしょうか、おそらく私は別の場所で何か間違っていますか?
<?xml version = \ "1.0 \" encoding = \ "utf-8 \"?> 'これはデバッガの文字列の内容を見るときに表示されるものですか?はいの場合は、正しく表示されます。デバッガでは、デバッガで変数の値を変更できるので、エスケープ形式の文字列を表示します。文字列を変更する場合は、コードに表示されるのと同じ形式で入力します。それはあなたの問題の原因ではないでしょう。また、BOMが存在する場合、BOMはxmlパーサーに失敗させるべきではありません。 – LB2
はい、ReadAsStringAsync()の後に文字列の内容が表示されます。私はBOMについて確信が持てませんでしたが、BOMがデシリアライザを破ってストリームの最初のバイトを投げ捨てる前に、BOMがデシリアライザを破ったとの別の質問がありました。 –
ファイルを読んで何らかの理由でBOMを破棄してしまうのではないかと思います。最初に文字列バッファに読み込んだ後、結果の文字列にBOMが含まれているかどうかをデバッガで確認してください(またはメモリバッファに格納されていて、最初の数バイトを調べてそれらがBOMかどうかを確認してください)。 – LB2