2009-08-24 38 views
5

Im tratando de crear un servicio web que lleva algunos argumentos en su constructor para salvar ronda de viajes, pero me siguen dando el error: CS1729 "servicename" no contiene un constructor que toma argumentos '1'¿El constructor Webservice C# no permite argumentos?

aunque cuando Intento crear un instante a nivel local (en el mismo proyecto que el servicio) todo funciona bien ... ¿qué da?

servicio web:

public class ayyash : System.Web.Services.WebService { 

    private string _myname; 
    public ayyash (string myname) { 


     _myname = myname; 

     //Uncomment the following line if using designed components 
     //InitializeComponent(); 
    } 
} 

consumo:

ayyash a = new ayyash("my name is ayyash"); 

de salida:

Compiler Error Message: CS1729: 'ayyash' does not contain a constructor that takes '1' arguments 
+0

No he probado pero ¿está expuesto el constructor como WebMethod? –

+1

no se puede exponer el constructor como un webmothod – Ayyash

Respuesta

7

El constructor del lado del servidor no se llama cuando usted instancia su proxy de cliente. Se invoca cuando se crea el objeto del lado del servidor; es decir, si se llama un método de servicio web y cuándo.

También vale la pena no tener miembros de instancias en un servicio web. No puede aceptar "nombre" en la construcción y usarlo de otros métodos; debe enviar un "nombre" en cada método de servicio web como argumento.En resumen, el "estado" del servicio web se debe pasar al servicio a través de argumentos del método o una cookie (aunque el uso de este último le causará problemas si pasa a WCF).

Imagine que cada vez que llama a un método en su objeto proxy, se crea un nuevo objeto del lado del servidor y se invoca ese método antes de que se destruya el objeto. Esto no es estrictamente cierto (el objeto se puede agrupar), pero lo ayudará a diseñar sus servicios web.

+0

sí ayuda, ¿conoce alguna documentación o artículos para explicar el estado de los servicios web? Estoy buscando una respuesta a: ¿por qué las variables privadas conservan los valores si se establecen dentro del constructor, pero no si se configuran en un método web? – Ayyash

+0

Ese escenario suena extraño, pero es más probable porque está recibiendo una instancia de grupo frente a una nueva instancia por pura casualidad. Sus únicas variables miembro en un servicio web (ASMX o WCF) deberían ser dependencias (es decir, repositorios y demás). Intentar almacenar el estado en las variables del miembro del servicio web solo le causará dolor. –

2

El default constructor will be called when the service host creates an instance in request a un mensaje de petición de servicio.

¿Por qué no obtener el constructor predeterminado para obtener los datos que necesita? Puede delegar en el constructor parametrizado.

public MyWebService : this(xxx) {} 

Lo que quiero decir es que el host de servicio siempre va a crear una instancia de la clase (para manejar la petición a través del constructor por defecto Si desea pasar parámetros a que usted tiene un número de opciones:.

  1. en el constructor por defecto ir fuera de la localizar los datos que necesita
  2. pasar los datos en la solicitud
  3. Posiblemente (no estoy seguro) extend/modify the asp.net request response pipe line utilizar un mecanismo de servicio de creación de instancia diferente. This link has some further examples.

Creo que WCF le permitirá hacer esto fácilmente más fácilmente. También puedes usar el HTTPListener directly.

+0

cómo? ¿cómo paso argumentos al constructor predeterminado? – Ayyash

+0

Si no necesita el constructor predeterminado, modifíquelo para tomar las herramientas que necesita. De lo contrario, cópielo y agregue los argumentos. Este primer enfoque de código no se considera el mejor enfoque para el desarrollo de servicios web. Puede ser mejor pero más lento generar WSDL y esquemas usted mismo y trabajar a partir de eso. –

+0

no creo que entienda, o puede ser que me falta algo, los contructors predeterminados (de forma predeterminada) no aceptan argumentos, y no importa lo que intento, el cliente no invoca ningún contructor con lista de argumentos ... eso está documentado en cualquier lugar acerca de los servicios web de C# .net? – Ayyash

6

Cuando el cliente está "instanciando" su servicio web, no está llamando al constructor en su servicio. Está creando una instancia de un objeto proxy local que representa su servicio. El objeto proxy generado por .NET solo admite un constructor predeterminado. Es por eso que obtienes un error de compilación.

La razón por la cual el objeto local funciona es porque realmente no está llamando a un servicio web. Simplemente está instanciando un objeto local y luego llamando a un método.

Creo que debe cambiar su enfoque para pasar todos los datos necesarios para el WebMethod. El enfoque típico con los servicios web es tener un servicio sin estado que acepte todos los datos requeridos para realizar la operación solicitada.

Por ejemplo:

[WebMethod] 
public string DoSomething(string name, string otherData) 
{ 
    ayyash yourObject = new ayyash(name); 

    return yourObject.DoIt(otherData); 
} 
+0

en realidad mi constructor predeterminado recibe una llamada (estoy usando Visual Studio) pero no puedo sobrecargarlo, ese es el problema que estoy enfrentando, pero me gusta su forma de pensar, necesito acostumbrarme a este concepto "sin estado" ... – Ayyash

+0

The al constructor se le llama por el lado del servicio para procesar la solicitud. Quiere que se llame al constructor no predeterminado. –

+0

leo en este artículo [http://www.xml.com/pub/a/ws/2003/01/08/randyray.html] lo siguiente: "Es importante señalar aquí que las operaciones sobrecargadas son compatibles con WSDL 1.1 (vea los enlaces en la sección "Recursos" a continuación), pero se han eliminado del borrador de la especificación para WSDL 1.2. " – Ayyash

Cuestiones relacionadas