WCF合同 - 命名空间和SerializationExceptions(WCF contracts

2019-10-20 06:29发布

我使用提供了以下调用和响应的第三方网络服务

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 ,它工作正常。 我知道我在这里失去了一个重要的概念 - 只是不知道看起来相当的东西。 什么是构建我的合同类型的正确方法,使他们能够正确地反序列化?

Answer 1:

我说您的第三方服务受到严重破坏。 有一个命名空间冲突在这里-有命名的两个元素response ,但不同的XML Schema类型。

我认为你将不得不不使用任何.NET技术涉及反序列化这个XML。 就没有办法告诉.NET成.NET类型反序列化XML。

你要自己手工做。 LINQ到XML是很方便的用于这一目的。



Answer 2:

你可以用这样的响应等级尝试:

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

    [XmlElement("bar")]
    public string Bar { get; set; }
}


文章来源: WCF contracts - namespaces and SerializationExceptions