代码之家  ›  专栏  ›  技术社区  ›  Hauke

能给我一个ASP.NET SOAP Web服务的可选参数吗

  •  14
  • Hauke  · 技术社区  · 16 年前

    我想用这个签名构建一个WebService,如果param2为空,它不会引发异常。这有可能吗?

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

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

    迄今为止尚未奏效的想法:

    • 方法重载不允许用于WebServices,如

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

    如建议 here :

    • 制作 bool 可空的 bool? . 相同的例外情况。
    • 操作WSDL,请参见 this answer

    我的问题与 this question 但唯一的答案是我还没有使用的WCF合同。

    6 回复  |  直到 8 年前
        1
  •  13
  •   Simon    13 年前

    可以在具有messagename属性的WebServices中使用重载方法。这是一个实现过载功能的解决方案。

    看 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 到外面去。

        2
  •  12
  •   Diego    13 年前

    如果你 真的? 必须做到这一点,这里有一个 黑客攻击 对于只有基元类型作为参数的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);
        ...
    }
    
        3
  •  7
  •   Jaleel    14 年前

    我知道这篇文章有点旧。但是我认为对于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;
    }
    
        4
  •  1
  •   Chuck Conway    16 年前

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

        5
  •  0
  •   Velizar Hristov    12 年前

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

        6
  •  0
  •   Alexey    8 年前

    按照 MinOccurs Attribute Binding Support 和 Default 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指定默认值的值类型-输出的minOccurs值 <元素& gt; 元素0。在 <元素& gt; 元素,默认值也通过默认XML属性指定。

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