WCF契約 - 名前空間とSerializationExceptions
-
19-09-2019 - |
質問
私は次の通話と応答を提供するサードパーティの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");
}
}
これを実行すると、次の例外が表示されます
ルート名「応答」とルートネームスペース ''でXMLボディを脱必要にすることができません(操作「getfoo」と契約(「ifoobarservice」、」http://tempuri.org/'))xmlserializerの使用。 XMLに対応するタイプが、サービスの既知のタイプコレクションに追加されていることを確認してください。
コメントした場合 GetBar
からの操作 IFooBarService
, 、それは正常に動作します。ここで重要な概念が欠けていることは知っています - 何を探すべきかわからないだけです。私の契約タイプを適切に洗練させることができるように、私の契約タイプを構築する適切な方法は何ですか?
解決
あなたのサードパーティのサービスはひどく壊れていると思います。ここには名前空間の衝突があります - 名前の2つの要素があります response
しかし、異なるXMLスキーマタイプを使用します。
このXMLの降下を伴う.NETテクノロジーを使用しないでください。どの.NETタイプにXMLを脱出するかを指示する方法はありません。
手作業でやらなければなりません。 linqからxmlは、この目的のために便利です。
他のヒント
このような応答クラスで試すことができます:
[XmlRoot("response")]
public class Response
{
[XmlElement("foo")]
public string Foo { get; set; }
[XmlElement("bar")]
public string Bar { get; set; }
}
所属していません StackOverflow