次の呼び出しと応答を提供するサードパーティの 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
ます。ここで重要な概念が欠けていることはわかっています。何を探すべきかまったくわかりません。適切に逆シリアル化できるように、コントラクト型を構築する適切な方法は何ですか?