2017-05-31 3 views
0

私はサードパーティの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ファイルには何かということです。これに対してクリーンな修正があるのでしょうか、おそらく私は別の場所で何か間違っていますか?

+0

<?xml version = \ "1.0 \" encoding = \ "utf-8 \"?> 'これはデバッガの文字列の内容を見るときに表示されるものですか?はいの場合は、正しく表示されます。デバッガでは、デバッガで変数の値を変更できるので、エスケープ形式の文字列を表示します。文字列を変更する場合は、コードに表示されるのと同じ形式で入力します。それはあなたの問題の原因ではないでしょう。また、BOMが存在する場合、BOMはxmlパーサーに失敗させるべきではありません。 – LB2

+0

はい、ReadAsStringAsync()の後に文字列の内容が表示されます。私はBOMについて確信が持てませんでしたが、BOMがデシリアライザを破ってストリームの最初のバイトを投げ捨てる前に、BOMがデシリアライザを破ったとの別の質問がありました。 –

+0

ファイルを読んで何らかの理由でBOMを破棄してしまうのではないかと思います。最初に文字列バッファに読み込んだ後、結果の文字列にBOMが含まれているかどうかをデバッガで確認してください(またはメモリバッファに格納されていて、最初の数バイトを調べてそれらがBOMかどうかを確認してください)。 – LB2

答えて

0

問題が

   await response.Content.CopyToAsync(fileStream); 
       fileStream.Close(); 

       //This fails with "the data at the root level is invalid" 
       XmlMediaTypeFormatter xmlFormatter = new XmlMediaTypeFormatter { UseXmlSerializer = true }; 
       var content = response.Content.ReadAsAsync<T>(new Collection<MediaTypeFormatter> { xmlFormatter }); 

HTTP応答は一度だけ消費することができます次のコードブロックです。換言すれば、応答は、複数の読み取りが処理されることができるいくつかのバッファに読み込まれない。それはソケットから直接読み取ります。だから一度読んだら、それを再び読むことはできません。

上記の応答をファイルにコピーします。これはレスポンスを消費し、もう一度読むことができなくなります。だから、contentに代入するときにもう一度それを読もうとすると、何も読み取られないので、(フォーマッタ内の)XMLパーサーはxml構文エラーb/cをスローします。

なぜファイルに保存するのか分かりませんが、一度ファイルに保存すると、ファイルを読み込んでその内容をxmlパーサーに送信するだけで、コードが正常に動作するはずです。もちろん、ファイルへの保存を削除した場合は、応答の内容を読み込んで解析することができます。

+0

投稿を更新します。私はデバッグの目的でファイル書き込みを追加しました。主に、即時ウィンドウに表示されないBOMがあるかどうかを確認します。 2番目の呼び出しはもともと唯一の呼び出しであり、失敗していました。 –

+0

@DavidJacobsen私は、あなたがコメントを外してからファイルの内容を読み込み、逆シリアル化しようとするとどうなりますか?それはその後動作しますか? – LB2

+0

はい、あります。それは第三者に報告されるバグではなく、よりクリーンな回答があると思う理由の一部です。 –

関連する問題