问题
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
boolnullablebool?. 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.
回答1:
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.
回答2:
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);
...
}
回答3:
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;
}
回答4:
You can not have overloaded Web Service methods. The SOAP protocol does not support it. Rasik's code is the workaround.
回答5:
Make all optional arguments strings. If no argument is passed, the input is treated as null.
回答6:
In accordance with MinOccurs Attribute Binding Support and Default Attribute Binding Support:
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.
result:[WebMethod] public SomeResult SomeMethod(bool optionalParam, [XmlIgnore] bool optionalParamSpecified)<s:element minOccurs="0" maxOccurs="1" name="optionalParam" type="s:boolean" />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.
result:[WebMethod] public SomeResult SomeMethod([DefaultValue(true)] bool optionalParam)<s:element minOccurs="0" maxOccurs="1" default="true" name="optionalParam" type="s:boolean" />
来源:https://stackoverflow.com/questions/1723052/can-i-have-an-optional-parameter-for-an-asp-net-soap-web-service