如何将OperationContract的参数指定为必填项

7
我想知道如何在WCF的OperationContract方法中将参数指定为必需,以便生成的xsd包含minOccurs="1"而不是minOccurs="0"。
示例:
[ServiceContract(Namespace = "http://myUrl.com")]  
public interface IMyWebService  
{  
   [OperationContract]  
   string DoSomething(string param1, string param2, string param3);  
}

生成此XSD:
<xs:element name="DoSomething">  
  <xs:complexType>  
    <xs:sequence>  
      <xs:element minOccurs="0" name="param1" nillable="true" type="xs:string" />  
      <xs:element minOccurs="0" name="param2" nillable="true" type="xs:string" />  
      <xs:element minOccurs="0" name="param3" nillable="true" type="xs:string" />  
    </xs:sequence>  
  </xs:complexType>  

但我希望在代码中定义minOccurs="1",而无需手动在xsd文件中修复它。


请查看这里,我认为这是更好的解决方案。 - Karel Kral
https://dev59.com/eXM_5IYBdhLWcg3wTRLL#3436039 - Freelancer
2个回答

10

您可能需要将参数包装在一个类中,然后可以使用DataMember属性,并指定IsRequired=true

[ServiceContract(Namespace = "http://myUrl.com")]  
public interface IMyWebService  
{  
   [OperationContract]  
   string DoSomething(RequestMessage request);  
}

[DataContract]
public class RequestMessage
{
   [DataMember(IsRequired = true)]
   public string param1 { get; set; }

   [DataMember(IsRequired = true)]
   public string param3 { get; set; }

   [DataMember(IsRequired = true)]
   public string param3 { get; set; }
}

这不是我希望看到的答案,但感谢您明确了应该如何做。 - Jan-Patrick Ahnen
5
这样做是否只会使得OperationContract中的"request"参数在生成的xsd中被标记为minOccurs="0"? - arathorn
@arathorn 我看到你在这里没有收到回复。你提出了一个很有力的观点。我认为你是正确的。根据我所读的,WCF中对OperationContract参数要求的强制执行不能在'Nullable'类型上完成,除非进入消息契约。这是我找到的一个链接:http://social.msdn.microsoft.com/Forums/vstudio/en-US/e707ed20-c09c-4e26-927a-7c3071d74ed7/operationcontract-with-required-parameters?forum=wcf...我认为你的观点是正确的。 - Zack Jannsen

3

这篇文章已经移动到https://thorarin.net/blog/post/2010/08/08/Controlling-WSDL-minOccurs-with-WCF。 - Luis Sagasta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接