15

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

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

异常是尝试将空字符串转换为布尔值时引发的 System.ArgumentException。

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

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

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

如此处建议:

  • 使bool可空bool?。同样的例外。
  • 操作 WSDL,请参阅此答案

我的问题与这个问题有关,但唯一的答案指向我尚未使用的 WCF 合同。

4

8 回答 8

15

如果你真的必须做到这一点,这里有一种针对只有原始类型作为参数的 web 方法的特定情况的hack :

[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);
    ...
}
于 2013-07-11T19:00:30.177 回答
13

您可以在具有 MessageName 属性的 Web 服务中使用重载方法。这是实现重载功能的一种解决方法。

看看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;
}

这些方法将在外部Add2可见。Add3

于 2009-11-12T16:45:34.163 回答
7

我知道这篇文章有点老了。但我认为 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;
}
于 2012-06-25T14:43:05.853 回答
3

按照MinOccurs Attribute Binding SupportDefault Attribute Binding Support

  1. 带有公共布尔字段的值类型,该字段使用前面在将 XSD 转换为源中描述的指定命名约定 - 输出<element>元素 0 的 minOccurs 值。

    [WebMethod]
    public SomeResult SomeMethod(bool optionalParam, [XmlIgnore] bool optionalParamSpecified)
    结果:
    <s:element minOccurs="0" maxOccurs="1" name="optionalParam" type="s:boolean" />

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

    [WebMethod]
    public SomeResult SomeMethod([DefaultValue(true)] bool optionalParam)
    结果:
    <s:element minOccurs="0" maxOccurs="1" default="true" name="optionalParam" type="s:boolean" />

于 2017-12-13T01:32:27.553 回答
1

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

于 2009-11-12T16:47:35.717 回答
1

使您的参数bool?并让您的调用者发送显式 null 也可以作为一种解决方法。

于 2021-07-26T17:37:39.147 回答
0

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

于 2014-03-10T19:20:15.760 回答
0

这是已证明对我有用的最佳解决方案。

只需将所有所需参数作为属性的数据类,并将该类作为唯一参数即可。这样,类的每个属性都将被可选地序列化,如果没有传入,则将是默认值。

这就是我所说的

[Serializable]
public class DataObj
{
    public int a { get; set; }
    public int b { get; set; }
    public int c { get; set; }
}

[WebMethod(MessageName = "MyMethod")]
public void MyMethod(DataObj dataObj)
{}
于 2022-02-26T01:24:04.483 回答