具有相同类型名称,相同XSD名称空间的WCF服务类型

时间:2011-12-21 22:56:20

标签: xml wcf web-services soap xsd

我有一个我想要公开的WCF服务方法。

服务方法参数类型是具有相同类名和XML名称空间的所有类型的基类。

所有派生类型都在不同的C#名称空间中,但必须在同一个xml名称空间中公开。以下是实施。

但是,尝试添加称为重复Shape类型的服务引用时发生错误。

理想情况下,Visual Studio应为第二个Shape自动分配C#名称空间(例如Set1.Shape,Set2.Shape)。所以它可以下载所有类型。

任何想法都会非常感激。

[ServiceContract]
public interface IShape
{
    [OperationContract]
    [ServiceKnownType(typeof(Set1.Shape))]
    [ServiceKnownType(typeof(Set2.Shape))]
    void GetShape(ShapeBase shape);
}

public class ShapeBase : IShape { }

//Example only. 
namespace Set1
{
    public class Shape : ShapeBase { }   
}

namespace Set2
{
    public class Shape : ShapeBase { }
}

更新

我能够在WCF服务端发布它们,这让人觉得它在客户端不能做同样的事情,因为WSDL不支持像C#这样的编程语言中的名称空间。

2 个答案:

答案 0 :(得分:0)

每种类型必须具有XML名称空间和XML名称的唯一组合。因此,如果您的类型必须位于同一XML命名空间中,则它们必须具有不同的元素名称目前他们很可能没有,因为CLR类型名称是相同的。

答案 1 :(得分:0)

正如Ladislav所说,您需要在同一XML命名空间内具有不同的节点名称。您可以使用DataContractAttribute的Name属性对此进行归因:

namespace Set1
{
    [DataContract(Name="Set1Shape")]
    public class Shape : ShapeBase { }   
}

namespace Set2
{
    [DataContract(Name="Set2Shape")]
    public class Shape : ShapeBase { }
}