【问题标题】:Can I have an optional parameter for an ASP.NET SOAP web service我可以为 ASP.NET SOAP Web 服务提供可选参数吗
【发布时间】:2010-12-15 22:26:13
【问题描述】:

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

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

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

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

  • webservice 不允许方法重载,比如

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

如建议here:

  • 使bool 可以为空bool?。同样的例外。
  • 操作 WSDL,见this answer

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

【问题讨论】:

    标签: c# .net asp.net web-services optional-parameters


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 是的,我也想知道这一点 - 否则为什么要使用不同的方法名称。我将建议将此作为对他的回答的修改。
      【解决方案3】:

      按照MinOccurs Attribute Binding SupportDefault Attribute Binding Support

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

        [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" />

      【讨论】:

      • [DefaultValue(true)] 也适用于属性
      【解决方案4】:

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

      【讨论】:

      • 这行得通(如果调用方缺少参数,则它是空的)。天呐!
      【解决方案5】:

      如果您真的必须完成此操作,这里有一个 某种技巧,适用于仅具有原始类型的 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);
          ...
      }
      

      【讨论】:

      • 不行! this.Context.Request["optionalParam1"] 总是返回 null
      • 这是WebMethod中缺少参数问题的答案。干得好
      【解决方案6】:

      您可以在具有 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 对外可见。

      【讨论】:

      • 这两种方法在外界看来是一样的吗?
      • 豪克,不,它对外界有两种不同的方法。这是重载的一种解决方法。
      【解决方案7】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-18
        • 2010-11-02
        • 2012-03-19
        • 1970-01-01
        • 2015-11-05
        • 2016-06-12
        • 1970-01-01
        相关资源
        最近更新 更多