在C#中为具有相同名称的派生类公开WCF服务

时间:2011-12-13 20:42:21

标签: wcf web-services

我希望将两组具有相同名称的类公开为WCF服务。但是,当我添加服务引用时,它只返回一组类。

[ServiceContract(Name = "Service1")]
    [XmlSerializerFormat]
    public interface IService1
    {               

        [OperationContract]
        [ServiceKnownType(typeof(S1.Retangle))]
        [ServiceKnownType(typeof(S1.Square))]
        [ServiceKnownType(typeof(S2.Retangle))]
        [ServiceKnownType(typeof(S2.Square))]   
        string GetShape(Shape shape);

    }

    //All types are only example
    [System.SerializableAttribute()]   
    [System.Xml.Serialization.XmlTypeAttribute()]
    public abstract class Shape
    {               
        public int Width { get; set; }

        public int Height { get; set; }

        public string TypeName { get; set; }
    }

    namespace S1
    {

        [System.SerializableAttribute()]
        [System.Xml.Serialization.XmlTypeAttribute()]
        public class Retangle : Shape
        { }

        [System.SerializableAttribute()]
        [System.Xml.Serialization.XmlTypeAttribute()]
        public class Square : Shape
        { }
    }

    namespace S2
    {

        //[DataContract]
        [System.SerializableAttribute()]
        [System.Xml.Serialization.XmlTypeAttribute(Namespace = "Namespace=http://tempuri.org/S2")]  //can be changed
        public class Retangle : Shape
        {   }

        //[DataContract]
        [System.SerializableAttribute()]
        [System.Xml.Serialization.XmlTypeAttribute(Namespace = "Namespace=http://tempuri.org/S2")] //can be changed
        public class Square : Shape
        {    }
    }

任何想法都会非常感激。

1 个答案:

答案 0 :(得分:0)

WCF将在其自己的命名空间中生成您的对象以供客户端使用但您不必使用它们 - 您也可以在它们由以下任一定义的命名空间中使用您自己的原始对象:
1.在dll中编译它们并链接到客户端和服务器的链接。
2.如果你不想要共享dll的开销,只需将它们直接编译到服务器和客户端即可 在生成的代理代码中,您只需要将WCF命名空间标记替换为您自己的组织命名空间,以便它们解析为您的对象,并忽略客户端WCF生成的对象。