7

短い C# アプリケーションで使用したい公開 Web サービスがあります: http://ws.parlament.ch/

この Web サービスから返された XML の先頭に「BOM」があるため、RESTSharp は XML の逆シリアル化に失敗し、次のエラー メッセージが表示されます。

応答の取得中にエラーが発生しました。詳細については、内部の詳細を確認してください。---> System.Xml.XmlException:ルート レベルのデータが無効です。1、位置 1
。 System.Xml.Linq.XDocument.Load(XmlReader リーダー、LoadOptions オプション) の System.Xml.XmlTextReaderImpl.Read() での ParseDocumentContent() System.Xml.Linq.XDocument.Parse(文字列テキスト、LoadOptions オプション) で
System.Xml.Linq.XDocument.Parse(文字列テキスト) で RestSharp.Deserializers.XmlDeserializer.Deserialize[T](IRestResponse 応答) で RestSharp.RestClient.Deserialize[T](IRestRequest 要求、IRestResponse 生)
--- 終了内部例外スタック トレース ---

http://ws.parlament.ch/sessions?format=xmlを使用して「セッション」のリストを取得する簡単なサンプルを次に示します。

public class Session
{
    public int Id { get; set; }
    public DateTime? Updated { get; set; }
    public int? Code { get; set; }
    public DateTime? From { get; set; }
    public string Name { get; set; }
    public DateTime? To { get; set; }
}


static void Main(string[] args)
    {
        var request = new RestRequest();
        request.RequestFormat = DataFormat.Xml;
        request.Resource = "sessions";
        request.AddParameter("format", "xml");

        var client = new RestClient("http://ws.parlament.ch/");
        var response = client.Execute<List<Session>>(request);

        if (response.ErrorException != null)
        {
            const string message = "Error retrieving response.  Check inner details for more info.";
            var ex = new ApplicationException(message, response.ErrorException);
            Console.WriteLine(ex);
        }

        List<Session> test = response.Data;

        Console.Read();
    }

返された xml を最初に Fiddler で操作して最初の 3 ビット (「BOM」) を削除すると、上記のコードが機能します! 誰かがこれをRESTSharpで直接処理するのを手伝ってくれませんか? 私は何を間違っていますか?よろしくお願いします!

4

4 に答える 4

8

解決策を見つけました-ヒントをありがとう@arootbeer!

XMLDeserializer をラップする代わりに、#RESTSharp の「RestRequest.OnBeforeDeserialization」イベントを使用することもできます。したがって、 new RestRequest() の後に次のようなものを挿入するだけで (最初のコード例を参照)、完璧に機能します!

request.OnBeforeDeserialization = resp =>
            {
                //remove the first ByteOrderMark
                //see: http://stackoverflow.com/questions/19663100/restsharp-has-problems-deserializing-xml-including-byte-order-mark
                string byteOrderMarkUtf8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
                if (resp.Content.StartsWith(byteOrderMarkUtf8))
                    resp.Content = resp.Content.Remove(0, byteOrderMarkUtf8.Length);
            };
于 2013-10-30T13:24:06.100 に答える