【问题标题】:WCF service types with same type name, same XSD namespace具有相同类型名称、相同 XSD 命名空间的 WCF 服务类型
【发布时间】:2012-01-25 17:13:52
【问题描述】:

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

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

所有派生类型都在不同的 C# 命名空间中,但必须在相同的 xml 命名空间中公开。下面是实现。

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

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

任何想法将不胜感激。

[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# 这样的编程语言中的名称空间。

【问题讨论】:

    标签: xml wcf web-services soap xsd


    【解决方案1】:

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

    【讨论】:

    • CLR 类型名称相同,但它们位于不同的名称空间中。这可能是因为 WSDL 不支持 C# 名称空间,或者 wcf 客户端没有关于何时分配不同名称空间的信息。
    • 默认情况下,CLR 命名空间用于创建 XML 命名空间,但它会为每个类生成不同的 XML 命名空间,这不是您提到的选项。一旦你重新定义了 XML 命名空间,CLR 命名空间就不再使用了。
    【解决方案2】:

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

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

    【讨论】:

    • 我知道。必须具有相同的已发布类型名称和相同的 xml 命名空间。您的建议有不同的发布类型名称。
    • @Pingpong:这个要求是不可能实现的。反序列化将不知道使用哪种类型。
    • 跨 XML Web 服务边界公开类型的唯一方法是通过 XML 命名空间与类型的根节点名称相结合。这定义您要公开的类型。你要求做什么是不合逻辑的。没有其他任何东西可以表明类型不同。因此,您收到的错误消息会告诉您。
    猜你喜欢
    • 1970-01-01
    • 2022-12-31
    • 2010-11-15
    • 2011-12-01
    • 2015-07-18
    • 1970-01-01
    • 2012-02-27
    • 2016-01-04
    • 1970-01-01
    相关资源
    最近更新 更多