Question

I want to build a webservice with this signature, which does not throw an exception if param2 is left empty. Is this possible?

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

The exception is a System.ArgumentException that is thrown when trying to convert the empty string to boolean.

Ideas that have not worked so far:

  • method overloading is not allowed for webservices, like

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

as suggested here:

  • make bool nullable bool?. Same exception.
  • manipulate the WSDL, see this answer

My question is related to this question, but the only answer points to WCF contracts, which I have not used yet.

Was it helpful?

Solution

You can have a Overloaded Method in webservices with MessageName attribute. This is a workaround to achieve the overloading functionality.

Look at 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;
}

The methods will be made visible as Add2 and Add3to the outside.

OTHER TIPS

If you REALLY have to accomplish this, here's a sort of hack for the specific case of a web method that has only primitive types as parameters:

[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);
    ...
}

I know this post is little old. But I think the method names should be same for the example from Rasik.If both method names are same, then where overloading comes there. I think it should be like this..

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

You can not have overloaded Web Service methods. The SOAP protocol does not support it. Rasik's code is the workaround.

Make all optional arguments strings. If no argument is passed, the input is treated as null.

In accordance with MinOccurs Attribute Binding Support and Default Attribute Binding Support:

  1. Value type accompanied by a public bool field that uses the Specified naming convention described previously under Translating XSD to source - minOccurs value of output <element> element 0.

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

  2. Value type with a default value specified via a System.Component.DefaultValueAttribute - minOccurs value of output <element> element 0. In the <element> element, the default value is also specified via the default XML attribute.

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

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top