Web Services 我可以为ASP.NETSOAPWeb服务设置一个可选参数吗

9vw9lbht  于 2022-11-24  发布在  .NET
关注(0)|答案(8)|浏览(208)

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

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

该异常是System.ArgumentException,它在尝试将空字符串转换为布尔值时引发。
迄今为止尚未奏效的想法:

  • Web服务不允许方法重载,例如
public string HelloWorld(string param1)
{
    return HelloWorld(param1, false);
}

如所建议的here

  • 使bool可为空。同样的异常。
  • 操作WSDL,请参阅此答案

我的问题与this question有关,但唯一的答案指向WCF合约,我还没有使用过。

gab6jxml

gab6jxml1#

如果你 * 真的 * 必须完成这个任务,这里有一个***类似的技巧***,针对一个只使用原语类型作为参数的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);
    ...
}
pgx2nnw8

pgx2nnw82#

您可以在具有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;
}

这些方法将显示为Add2Add3

41ik7eoe

41ik7eoe3#

我知道这篇文章有点老了。但是我认为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;
}
de90aj5v

de90aj5v4#

根据MinOccurs属性系结支援和预设属性系结支援:
1.实值型别(Value Type)搭配公用布林(Bool)字段,该字段使用先前在将XSD转译为来源-minOccurs value of output <element> element 0下所述的指定命名惯例。

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

结果:

<s:element minOccurs="0" maxOccurs="1" name="optionalParam" type="s:boolean" />

1.具有通过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" />
9rnv2umw

9rnv2umw5#

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

0mkxixxg

0mkxixxg6#

将参数设为bool?并让调用方发送显式空值也是一种解决方法。

5kgi1eie

5kgi1eie7#

这是最好的解决方案,已证明对我的工作。

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

[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)
{}
txu3uszq

txu3uszq8#

将所有可选参数设置为字符串。如果未传递任何参数,则将输入视为空。

相关问题