C# 如何在不破坏web服务契约的情况下移动类属性?
我最近对一个WCF web服务做了一些更改,打破了我的web服务合同。我希望有一种方法可以生成向后兼容的相同/相似的WSDL(目前,无论在客户端代码中设置为什么,updateType始终为=0/None) 我下面的代码只显示与问题相关的部分 这就是我的代码最初的样子: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
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" />