2012-05-15 117 views
1

是否可以使用WCF在wsdl中將字符串nillable的默認值更改爲false? 我找不到任何屬性或設置開箱即用,但是有可能通過使用屬性自行執行此操作來以某種方式擴展WCF?還是有更好的辦法?我需要把我的一些字符串屬性標記爲nillable = false,但不是全部。將WCF設置爲nillable = false

e.g:

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

退房http://stackoverflow.com/questions/1589750/wcf-string-element-nillable-false – GTG

+0

他似乎是通過設置他所有的字符串或全部必需的來清除虛假的,而不是真的是我想要做的。我設法讓WsdlExporter工作,但現在我需要在生成的模式和我的接口和類之間進行一些匹配,以獲得我的[Nillable]屬性。關於在哪裏可以找到這種信息的任何想法? – Markus

+0

相關:http://stackoverflow.com/questions/9039850/wcf-wsdl-nillable-attributes/21266714#21266714 – Steven

回答

0
[DataMember(IsRequired=True)] 

這應該這樣做,我相信?

+0

試過,它只設置成員在郵件中是必需的。一個字符串可以是null,並且仍然是消息的一部分。 – Markus

+0

我同意。這不是*答案,WCF消費者(如SharePoint BCS)仍然會認爲該值能夠爲空 - 在嘗試將其用作標識時,它會抱怨。因此這不是解決這個問題的適當方法。 – user2246674

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]你的服務類。

希望這會有所幫助。

相關問題