Frage

Ich verwende einen Webdienst von Drittanbietern, der die folgenden Anrufe und Antworten anbietet

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

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

und

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

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

Dies ist der Vertrag und die unterstützenden Typen, die ich geschrieben habe

[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; }
}

Und dann sieht mein Kunde so aus

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

Wenn ich das ausführe, bekomme ich die folgende Ausnahme

XML -Körper kann nicht mit dem Root -Namen 'Antwort' und des Root -Namespace '' (für den Betrieb 'getfoo' und den Vertrag ('ifoobarservice', ',', ',', 'http://tempuri.org/')) Mit XMLSerializer. Stellen Sie sicher, dass der Typ, der dem XML entspricht, der bekannten Typentyps des Dienstes hinzugefügt wird.

Wenn ich das kommentiere GetBar Betrieb von IFooBarService, es funktioniert gut. Ich weiß, dass ich hier ein wichtiges Konzept fehlt - weiß einfach nicht genau, wonach ich suchen soll. Was ist der richtige Weg, um meine Vertragstypen zu konstruieren, damit sie ordnungsgemäß deserialisiert werden können?

War es hilfreich?

Lösung

Ich würde sagen, Ihr Service von Drittanbietern ist schlecht kaputt. Hier gibt es eine Namespace -Kollision - es sind zwei Elemente benannt response aber mit unterschiedlichen XML -Schema -Typen.

Ich denke, Sie müssen keine .NET -Technologie verwenden, bei der diese XML -Deserialisierung beinhaltet. Es würde keine Möglichkeit geben, .NET zu sagen, welche .NET -Typen, um die XML zu deserialisieren.

Du musst es einfach von Hand machen. LINQ zu XML ist für diesen Zweck praktisch.

Andere Tipps

Sie können es mit einer solchen Antwortklasse versuchen:

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

    [XmlElement("bar")]
    public string Bar { get; set; }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top