如何在不破坏Web服务合同的情况下移动类属性?

时间:2014-02-05 01:26:36

标签: c# wcf web-services wsdl

我最近对WCF WebService进行了一些更改,这违反了我的Web服务合同。我希望有一种方法可以生成向后兼容的相同/类似的WSDL(目前,无论我在客户端代码中设置什么,UpdateTypes总是= 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" />

这就是我改变了破坏我的Web服务合同的类代码:

public class User : IUpdateable
{
    [DataMember()]
    public UpdateTypes UpdateType { get; set; }

    //...other properties and methods
}

因为它将WSDL更改为这样(注意现在缺少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" />

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

1 个答案:

答案 0 :(得分:0)

您可以指示WCF使用与原始合同匹配的自定义WSDL,尽管它不是微不足道的。这是一个向WSDL添加文档的微软示例: http://msdn.microsoft.com/en-us/library/aa717040(v=vs.110).aspx