C# 如何在不破坏web服务契约的情况下移动类属性?

C# 如何在不破坏web服务契约的情况下移动类属性?,c#,wcf,web-services,wsdl,C#,Wcf,Web Services,Wsdl,我最近对一个WCF web服务做了一些更改,打破了我的web服务合同。我希望有一种方法可以生成向后兼容的相同/相似的WSDL(目前,无论在客户端代码中设置为什么,updateType始终为=0/None) 我下面的代码只显示与问题相关的部分 这就是我的代码最初的样子: public enum UpdateTypes { None = 0, Insert = 1, Update = 2, Delete = 3 } [DataContract()] public c

我最近对一个WCF web服务做了一些更改,打破了我的web服务合同。我希望有一种方法可以生成向后兼容的相同/相似的WSDL(目前,无论在客户端代码中设置为什么,updateType始终为=0/None)

我下面的代码只显示与问题相关的部分

这就是我的代码最初的样子:

public enum UpdateTypes
{
    None = 0,
    Insert = 1,
    Update = 2,
    Delete = 3
}

[DataContract()]
public class BaseEntity
{
    [DataMember()]
    public UpdateTypes UpdateType {get; set;}
}

public class User : BaseEntity
{
    //...other properties and methods
}
它生成了如下所示的WSDL:

<xs:complexType name="BaseEntity">
    <xs:sequence>
       <xs:element minOccurs="0" name="UpdateType" type="tns:UpdateTypes" />
    </xs:sequence>
</xs:complexType>
<xs:element name="BaseEntity" nillable="true" type="tns:BaseEntity" />
<xs:simpleType name="UpdateTypes">
    <xs:restriction base="xs:string">
       <xs:enumeration value="None" />
       <xs:enumeration value="Insert" />
       <xs:enumeration value="Update" />
       <xs:enumeration value="Delete" />
    </xs:restriction>
</xs:simpleType>
<xs:element name="UpdateTypes" nillable="true" type="tns:UpdateTypes" />
因为它将WSDL更改为如下所示(请注意,BaseEntity部分现在已丢失):



这会导致UpdateType在到达最新更新的WCF服务端点应用程序时始终为0。

您可以指示WCF使用与原始契约匹配的自定义WSDL,尽管这并不简单。下面是一个向WSDL添加文档的microsoft示例:

我不确定这是否会对我有帮助,因为我希望该服务的任何新实现都使用新的/当前的wsdl,但我不想破坏仍然使用旧wsdl的任何当前实现。您修订的代码没有引用
BaseEntity
,它引用了
BaseUser
…?这是一个输入错误,我删除了它-它根本不应该继承(尽管它将来可能会继承)
public class User : IUpdateable
{
    [DataMember()]
    public UpdateTypes UpdateType { get; set; }

    //...other properties and methods
}
<xs:simpleType name="UpdateTypes">
    <xs:restriction base="xs:string">
       <xs:enumeration value="None" />
       <xs:enumeration value="Insert" />
       <xs:enumeration value="Update" />
       <xs:enumeration value="Delete" />
    </xs:restriction>
</xs:simpleType>
<xs:element name="UpdateTypes" nillable="true" type="tns:UpdateTypes" />