2009-08-24 12 views
5

Im cercando di creare un servizio web che prende alcuni argomenti nel suo costruttore per salvare round trip, ma io continuo a ricevere l'errore: CS1729 "servicename" non contiene un costruttore che prende argomenti '1'Il costruttore Webservice C# non consente gli argomenti?

anche se quando Cerco di creare un istante localmente (nello stesso progetto del servizio) tutto funziona bene ... cosa dà?

servizio 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"); 

uscita:

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

Non ho provato ma il costruttore è esposto come WebMethod? –

+1

non puoi esporre il costruttore come webmothod – Ayyash

risposta

7

Il costruttore lato server non viene chiamato quando si istanzia l'proxy client. Viene chiamato quando viene creato l'oggetto lato server; cioè, se e quando viene chiamato un metodo di servizio web.

Inoltre non vale niente che non sia possibile avere membri di istanza su un servizio web. Non puoi accettare "nome" nel costrutto e usarlo da altri metodi; devi inviare "nome" in ogni metodo di servizio web come argomento.In breve, lo "stato" del servizio web deve essere passato al servizio tramite gli argomenti del metodo o un cookie (sebbene l'utilizzo di quest'ultimo causerà problemi se si passa a WCF).

Immagina che ogni volta che chiami un metodo sul tuo oggetto proxy, venga creato un nuovo oggetto lato server e tale metodo venga chiamato prima che l'oggetto venga distrutto. Questo non è strettamente vero (l'oggetto può essere raggruppato), ma ti aiuterà a progettare i tuoi servizi web.

+0

sì, è utile, si conosce la documentazione o gli articoli per spiegare lo stato dei servizi Web? Sto cercando una risposta a: perché le variabili private preservano i valori se impostati all'interno del costruttore, ma non se sono impostati in un metodo web? – Ayyash

+0

Questo scenario sembra strano, ma è più probabile perché si sta ricevendo un'istanza del pool rispetto a una nuova istanza solo per caso. Le tue uniche variabili membro in un servizio web (ASMX o WCF) dovrebbero essere le dipendenze (cioè i repository e così via). Provare a memorizzare lo stato nelle variabili dei membri del servizio Web causerà solo dolore. –

2

La default constructor will be called when the service host creates an instance in request a un messaggio di richiesta di servizio.

Perché non ottenere il costruttore predefinito per ottenere i dati necessari? È possibile delegare al costruttore parametrizzato.

public MyWebService : this(xxx) {} 

Quello che voglio dire è che il servizio di accoglienza sarà sempre creare un'istanza della classe (per gestire la richiesta tramite il costruttore di default Se si vuole passare i parametri ad essa si dispone di una serie di opzioni:.

  1. nel costruttore predefinito andare fuori dai individuare i dati di cui ha bisogno
  2. passare i dati nella Richiesta
  3. Forse (non sono sicuro) extend/modify the asp.net request response pipe line di utilizzare un meccanismo di servizio di creazione un'istanza diversa. This link has some further examples.

Credo che WCF ti consenta di farlo facilmente più facilmente. Inoltre è possibile utilizzare HTTPListener directly.

+0

come? come posso passare argomenti al costruttore predefinito? – Ayyash

+0

Se non è necessario il costruttore predefinito, modificarlo per prendere gli argumnenti necessari. Altrimenti copialo e aggiungi gli argomenti. Questo primo approccio al codice non è considerato il miglior approccio allo sviluppo di servizi web. Potrebbe essere meglio, ma più lento, generare WSDL e schemi da soli e lavorare da quello. –

+0

non penso che tu capisca, o possa essere mi manchi qualcosa, i controtori di default (per impostazione predefinita) non accettano argomenti, e non importa quello che provo, il client non invoca alcun contructor con elenco di argomenti ... è documentato ovunque su C# .net servizi web? – Ayyash

6

Quando il client "crea un'istanza" del servizio Web, non chiama il costruttore sul servizio. Crea un'istanza di un oggetto proxy locale che rappresenta il tuo servizio. L'oggetto proxy generato da .NET supporta solo un costruttore predefinito. Questo è il motivo per cui ottieni un errore del compilatore.

Il motivo per cui l'oggetto locale funziona è che in realtà non si sta chiamando un servizio Web. Stai semplicemente creando un'istanza di un oggetto locale e poi chiamando un metodo su di esso.

Penso che sia necessario modificare l'approccio per passare tutti i dati richiesti al WebMethod. L'approccio tipico con i servizi Web consiste nell'avere un servizio stateless che accetta tutti i dati necessari per eseguire l'operazione richiesta.

Ad esempio:

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

    return yourObject.DoIt(otherData); 
} 
+0

effettivamente il mio costruttore predefinito viene chiamato (sto usando Visual Studio) ma non riesco a sovraccaricarlo, questo è il problema che sto affrontando, ma mi piace il tuo pensiero, devo abituarmi a questo concetto "apolide" ... – Ayyash

+0

il costruttore viene chiamato dal lato del servizio per elaborare la richiesta. Vuole che venga chiamato il costruttore non predefinito. –

+0

ho letto in questo articolo [http://www.xml.com/pub/a/ws/2003/01/08/randyray.html] il seguente: "È importante notare qui che le operazioni sovraccaricate sono supportate in WSDL 1.1 (vedere i collegamenti nella sezione "Risorse" di seguito), ma sono stati rimossi dalle specifiche di bozza per WSDL 1.2. " – Ayyash

Problemi correlati