1

次の呼び出しと応答を提供するサードパーティの Web サービスを使用しています

http://api.athirdparty.com/rest/foo?apikey=1234

<response>
  <foo>this is a foo</foo>
</response>

http://api.athirdparty.com/rest/bar?apikey=1234

<response>
  <bar>this is a bar</bar>
</response>

これは私が書いたコントラクトとサポートタイプです

[ServiceContract]
[XmlSerializerFormat]
public interface IFooBarService
{
    [OperationContract]
    [WebGet(
        BodyStyle = WebMessageBodyStyle.Bare,
        ResponseFormat = WebMessageFormat.Xml,
        UriTemplate = "foo?key={apikey}")]
    FooResponse GetFoo(string apikey);

    [OperationContract]
    [WebGet(
        BodyStyle = WebMessageBodyStyle.Bare,
        ResponseFormat = WebMessageFormat.Xml,
        UriTemplate = "bar?key={apikey}")]
    BarResponse GetBar(string apikey);
}

[XmlRoot("response")]
public class FooResponse
{
    [XmlElement("foo")]
    public string Foo { get; set; }
}

[XmlRoot("response")]
public class BarResponse
{
    [XmlElement("bar")]
    public string Bar { get; set; }
}

そして、私のクライアントはこのように見えます

static void Main(string[] args)
{
    using (WebChannelFactory<IFooBarService> cf = new WebChannelFactory<IFooBarService>("thirdparty"))
    {
        var channel = cf.CreateChannel();
        FooResponse result = channel.GetFoo("1234");
    }
}

これを実行すると、次の例外が発生します

XmlSerializer を使用して、ルート名 'response' およびルート名前空間 '' (操作 'GetFoo' およびコントラクト ('IFooBarService', ' http://tempuri.org/ ') の場合) を持つ XML 本体を逆シリアル化できません。XML に対応する型が、サービスの既知の型コレクションに追加されていることを確認してください。

GetBarからの操作をコメントアウトすると、正常に動作しIFooBarServiceます。ここで重要な概念が欠けていることはわかっています。何を探すべきかまったくわかりません。適切に逆シリアル化できるように、コントラクト型を構築する適切な方法は何ですか?

4

2 に答える 2

2

あなたのサードパーティサービスはひどく壊れていると思います. ここには名前空間の衝突があります。2 つの要素に名前responseが付けられていますが、XML スキーマの型が異なります。

この XML の逆シリアル化に関連する .NET テクノロジを使用しないようにする必要があると思います。XML を逆シリアル化する .NET 型を .NET に伝える方法はありません。

手でやるしかありません。この目的には、LINQ to XML が便利です。

于 2010-03-12T01:35:29.687 に答える
0

次のような応答クラスで試すことができます。

[XmlRoot("response")]
public class Response
{
    [XmlElement("foo")]
    public string Foo { get; set; }

    [XmlElement("bar")]
    public string Bar { get; set; }
}
于 2011-11-09T13:57:58.967 に答える