¿Puedo tener un parámetro opcional para un servicio web ASP.NET SOAP

Quiero construir un servicio web con esta firma, que no arroja una excepción si param2 se deja vacío. es posible?

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

La excepción es una System.ArgumentException que se lanza al intentar convertir la cadena vacía a boolean.

Ideas que no han funcionado hasta ahora:

  • la sobrecarga de métodos no está permitida para los servicios web, como

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

como se sugiere aquí :

  • hacer bool nullable bool? . La misma excepción.
  • manipular el WSDL, ver esta respuesta

Mi pregunta está relacionada con esta pregunta , pero la única respuesta apunta a los contratos de WCF, que aún no he utilizado.

Puede tener un Método sobrecargado en los servicios web con el atributo MessageName. Esta es una solución para lograr la funcionalidad de sobrecarga.

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

Los métodos se harán visibles como Add2 y Add3 en el exterior.

Si REALMENTE tiene que lograr esto, aquí hay una especie de truco para el caso específico de un método web que solo tiene tipos primitivos como parámetros:

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

Sé que esta publicación es un poco vieja. Pero creo que los nombres de los métodos deberían ser los mismos para el ejemplo de Rasik. Si ambos nombres de métodos son los mismos, entonces la sobrecarga aparece allí. Creo que debería ser así …

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

No puede haber métodos de servicio web sobrecargados. El protocolo SOAP no lo admite. El código de Rasik es la solución.

Haga todas las cadenas de argumentos opcionales. Si no se pasa ningún argumento, la entrada se trata como nula.

De acuerdo con MinOccurs Attribute Binding Support y Default Attribute Binding Support :

  1. Tipo de valor acompañado de un campo de bool público que utiliza la convención de nomenclatura especificada descrita previamente en Traducir XSD a fuente – valor de obtención mínima del de salida 0.

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

    resultado:

      

  2. Tipo de valor con un valor predeterminado especificado a través de System.Component.DefaultValueAttribute – minOccurs value del de salida. En el , el valor predeterminado también se especifica mediante el atributo XML predeterminado.

     [WebMethod] public SomeResult SomeMethod([DefaultValue(true)] bool optionalParam) 

    resultado: