如何在WCF中将有限值设置为maxoccurs而不是“unbounded”

时间:2014-11-10 07:50:00

标签: c# .net xml wcf xsd

我有一个WCF服务。当我公开我的服务时,我的所有Datacontracts都转换为元素,并且还转换为" ArrayOf"对于具有ComplextType标记的每个元素。在ComplextType标记中,maxOccurs的默认值为" unbounded"。

但实际上我想重写这个maxOccurs值并为" ArrayOf"中的每个元素设置一个有限值(例如:maxOccurs =" 10")。在生成的XSD文件中。

我尝试过实施IXMLSerializable,但没有工作。有人可以帮我解决这个问题吗?

注意:服务和数据合同名称空间不同

我的服务合同:

[ServiceContract]
public interface IMyService
{
    [OperationContract]
    [FaultContract(typeof(ServiceApplicationFault), Action = ServiceApplicationFault.FaultContractAction)]
    EmployeeModel GetDetails(String EmpId);
}

我的数据合同

[DataContract]
public class EmployeeModel
{
    [DataMember]
    public string EmpId { get; set; }

    [DataMember]
    public string EmpName { get; set; }

    [DataMember]
    public string EmpDept { get; set; }

}

我生成的XSD

<xs:complexType name="ArrayOfEmployeeModel">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="EmployeeModel" nillable="true" type="tns:EmployeeModel"/>
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfEmployeeModel" nillable="true" type="tns:ArrayOfEmployeeModel"/>
<xs:complexType name="EmployeeModel">
<xs:sequence>
<xs:element minOccurs="0" name="EmpId" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="EmpName" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="EmpDept" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="EmployeeModel" nillable="true" type="tns:EmployeeModel"/>

1 个答案:

答案 0 :(得分:0)

经过长时间的研究,我找到了解决问题的方法。我们可以通过编写生成的XSD架构来完成此操作。编写此模式可以通过实现 IContractBehavior,IWsdlExportExtension 接口来完成。

步骤1:创建一个名称后缀为“Attribute”的类,并为该类实现Attribute类和IContractBehavior,IWsdlExportExtension。

第2步:将此类作为属性添加到服务合同中。

步骤3:现在在方法IWsdlExportExtension.ExportEndpoint(WsdlExporter exporter,WsdlEndpointConversionContext context)中实现您的需求。此时,您将获得元数据信息。

有关详细信息,请参阅herehere

谢谢大家!