使用WCF设置nillable = false

时间:2012-05-15 14:18:01

标签: wcf wsdl

是否可以使用WCF在wsdl中将字符串上的nillable的默认值更改为false? 我找不到任何开箱即用的属性或设置,但是可以通过使用属性自己来以某种方式扩展WCF吗?或者有更好的方法吗?我需要将我的一些字符串属性标记为nillable = false,但不是全部。

e.g:

[DataMember]
[Nillable(false)]
public string MyData{ get; set; }

2 个答案:

答案 0 :(得分:0)

[DataMember(IsRequired=True)]

我应该这样做吗?

答案 1 :(得分:0)

您必须编写自己的WsdlExportExtension来实现此目的。

以下是一个示例:

public class WsdlExportBehavior : Attribute, IContractBehavior, IWsdlExportExtension
{
    public void ExportContract(WsdlExporter exporter, WsdlContractConversionContext context)
    { }

    public void ExportEndpoint(WsdlExporter exporter, WsdlEndpointConversionContext context)
    {
        var schemaSet = exporter.GeneratedXmlSchemas;

        foreach (var value in schemaSet.GlobalElements.Values)
        {
            MakeNotNillable(value);
        }

        foreach (var value in schemaSet.GlobalTypes.Values)
        {
            var complexType = value as XmlSchemaComplexType;
            if (complexType != null && complexType.ContentTypeParticle is XmlSchemaSequence)
            {
                var sequence = complexType.ContentTypeParticle as XmlSchemaSequence;
                foreach (var item in sequence.Items)
                {
                    MakeNotNillable(item);
                }
            }
        }
    }

    private static void MakeNotNillable(object item)
    {
        var element = item as XmlSchemaElement;
        if (element != null)
        {
            element.IsNillable = false;
        }
    }

    public void AddBindingParameters(ContractDescription description, ServiceEndpoint endpoint, BindingParameterCollection parameters)
    { }

    public void ApplyClientBehavior(ContractDescription description, ServiceEndpoint endpoint, ClientRuntime client)
    { }

    public void ApplyDispatchBehavior(ContractDescription description, ServiceEndpoint endpoint, DispatchRuntime dispatch)
    { }

    public void Validate(ContractDescription description, ServiceEndpoint endpoint)
    { }
}

将[WsdlExportBehavior]应用于您的服务类。

希望这有帮助。