我有一个我想要公开的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#这样的编程语言中的名称空间。
答案 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 { }
}