我是否可以为ASP.NET SOAP Web服务提供可选参数

我想用这个签名构建一个web服务,如果param2留空,它不会抛出exception。 这可能吗?

[WebMethod] public string HelloWorld(string param1, bool param2) { } 

exception是在尝试将空字符串转换为布尔值时抛出的System.ArgumentException。

到目前为止没有奏效的想法:

  • Web服务不允许使用方法重载,例如

     public string HelloWorld(string param1) { return HelloWorld(param1, false); } 

如下所示:

  • bool自杀的bool? 。 同样的例外。
  • 操纵WSDL,看到这个答案

我的问题与这个问题有关 ,但唯一的答案是WCF合同,我还没有使用过。

您可以在具有MessageName属性的webservices中使用重载方法。 这是实现重载function的解决方法。

请看http://msdn.microsoft.com/en-us/library/byxd99hx%28VS.71%29.aspx

 [WebMethod(MessageName="Add3")] public double Add(double dValueOne, double dValueTwo, double dValueThree) { return dValueOne + dValueTwo + dValueThree; } [WebMethod(MessageName="Add2")] public int Add(double dValueOne, double dValueTwo) { return dValueOne + dValueTwo; } 

这些方法将作为Add2Add3在外部。

如果你真的必须完成这个,那么对于只有基本类型作为参数的web方法的特定情况,这是一种破解

 [WebMethod] public void MyMethod(double requiredParam1, int requiredParam2) { // Grab an optional param from the request. string optionalParam1 = this.Context.Request["optionalParam1"]; // Grab another optional param from the request, this time a double. double optionalParam2; double.TryParse(this.Context.Request["optionalParam2"], out optionalParam2); ... } 

我知道这篇文章有点旧。 但我认为方法名称对于Rasik的示例应该是相同的。如果两个方法名称相同,那么重载就会出现在那里。 我想应该是这样的……

 [WebMethod(MessageName="Add3")] **public double Add(double dValueOne, double dValueTwo, double dValueThree)** { return dValueOne + dValueTwo + dValueThree; } [WebMethod(MessageName="Add2")] **public int Add(double dValueOne, double dValueTwo)** { return dValueOne + dValueTwo; } 

您不能重载Web Service方法。 SOAP协议不支持它。 Rasik的代码就是解决方法。

制作所有可选参数字符串。 如果未传递参数,则将输入视为null。

根据MinOccurs属性绑定支持和默认属性绑定支持 :

  1. 值类型伴随公共bool字段,该字段使用先前在将XSD转换为源 – 源输出元素0的minOccurs值时所述的指定命名约定。

     [WebMethod] public SomeResult SomeMethod(bool optionalParam, [XmlIgnore] bool optionalParamSpecified) 

    结果:

      

  2. 具有通过System.Component.DefaultValueAttribute指定的默认值的值类型 – 输出元素0的minOccurs值。在元素中,还通过默认XML属性指定默认值。

     [WebMethod] public SomeResult SomeMethod([DefaultValue(true)] bool optionalParam) 

    结果: