【问题标题】:setting nillable=false with WCF使用 WCF 设置 nillable=false
【发布时间】:2012-05-15 14:18:01
【问题描述】:

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

例如:

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

【问题讨论】:

  • 似乎他通过将所有字符串或所有必需的字符串设置为 nillable false 来解决它,这并不是我真正想做的。我已经设法让 WsdlExporter 工作,但现在我需要在生成的模式与我的接口和类之间进行一些匹配以获取我的 [Nillable] 属性。关于在哪里可以找到此类信息的任何想法?

标签: wcf wsdl


【解决方案1】:
[DataMember(IsRequired=True)]

我相信这应该可以吗?

【讨论】:

  • 试过了,它只在消息中设置了该成员是必需的。字符串可以为 null 并且仍然是消息的一部分。
  • 我同意。这不是答案,WCF 使用者(如 SharePoint BCS)仍会假定该值可以为空 - 在尝试将其用作身份时它会抱怨这一点。因此,这不是解决此问题的合适方法。
【解决方案2】:

您必须编写自己的 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] 应用到您的服务类。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 2015-11-21
    • 2015-04-27
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多