2009-08-03 15 views
22

Ho un servizio Web che contiene questo metodo:Come chiamare un metodo di servizio Web?

[WebMethod] 
public static List<string> GetFileListOnWebServer() 
{ 
    DirectoryInfo dInfo = new DirectoryInfo(HostingEnvironment.MapPath("~/UploadedFiles/")); 
    FileInfo[] fInfo = dInfo.GetFiles("*.*", SearchOption.TopDirectoryOnly); 

    List<string> listFilenames = new List<string>(fInfo.Length); 

    for(int i = 0; i < fInfo.Length; i++) 
    { 
     listFilenames.Add(fInfo[i].Name); 
    } 

    return listFilenames; 
} 

Questo restituisce un elenco di nomi di file in una cartella. Quando eseguo il debug dell'applicazione, funziona correttamente.

Quello che voglio fare è chiamare questo metodo webservice da un'applicazione winform. Ho aggiunto un riferimento al DLL del webservice, ed è così chiamo il metodo di cui sopra:

private void Form1_Load(object sender, EventArgs e) 
{ 
    List<string> files = TestUploaderWebService.Service1.GetFileListOnWebServer(); 
} 

Il codice sopra non funziona - quando entra nel metodo, il percorso della applicazione web è nullo e anche molte proprietà della classe HostingEnvironment sono nulle. Dov'è il mio errore, nel tentativo di chiamare un metodo di servizio web da un'altra app Winform?

Si noti che il servizio Web è realizzato in Visual Web Developer Express e Winform in Visual C# express; questo è il motivo per cui ho dovuto aggiungere la dll del servizio web come riferimento nell'app winform. Non ho Visual Studio completo, il che mi avrebbe consentito un'unica soluzione con entrambi i progetti.

Sono nuovo ai servizi web.

PS - amo la formattazione del testo on-the-fly qui :)

risposta

18

In Visual Studio, utilizzare la funzione "Aggiungi riferimento Web" e quindi immettere l'URL del vostro servizio web.

Aggiungendo un riferimento alla DLL, non si fa riferimento come servizio Web, ma semplicemente come un assembly.

Quando si aggiunge un riferimento Web, viene creata una classe proxy nel progetto con metodi/argomenti uguali o simili al proprio servizio web. Quella classe proxy comunica con il tuo servizio web via SOAP, ma nasconde tutto il materiale del protocollo di comunicazione in modo da non doversene preoccupare.

+0

Superb - grazie mille! Ora ho rimosso la ref dll e aggiunto un riferimento di servizio all'URL. Tuttavia ho notato che non mi dà accesso diretto al mio metodo, invece ho accesso alle classi chiamate: GetFileListOnWebServerRequest, GetFileListOnWebServerRequestBody, GetFileListOnWebServerResponse, GetFileListOnWebServerResponseBody.c'è qualche risorsa web che posso leggere riguardo a queste classi autogenerate? Non so come usarli. –

+0

Genera molte parti, ma cerca solo il metodo GetFileListOnWebServer stesso. –

+1

In realtà, guarda l'esempio di John. –

1

La risposta di James è corretta, ovviamente, ma dovrei ricordarvi che l'intera cosa di ASMX è, se non obsoleta, almeno non il metodo attuale. Ti suggerisco caldamente di esaminare la WCF, se non altro per evitare di imparare cose che dovrai dimenticare.

+0

Grazie per la risposta, Steven! Certamente esaminerò la WCF. Tuttavia, per quanto riguarda questo compito, è un "homework", quindi mi è stato detto di usare asmx :) Cheers! –

+0

Ok, ma se è compito, taggalo come tale. Mi sono preso la libertà di farlo per te. –

10

Il modo corrente per eseguire questa operazione è utilizzare il comando "Aggiungi riferimento servizio". Se si specifica "TestUploaderWebService" come nome di riferimento del servizio, verrà generato il tipo TestUploaderWebService.Service1. Quella classe avrà un metodo chiamato GetFileListOnWebServer, che restituirà una serie di stringhe (è possibile cambiarle per essere una lista di stringhe, se lo si desidera). Si potrebbe usare in questo modo:

string[] files = null; 
TestUploaderWebService.Service1 proxy = null; 
bool success = false; 
try 
{ 
    proxy = new TestUploaderWebService.Service1(); 
    files = proxy.GetFileListOnWebServer(); 
    proxy.Close(); 
    success = true; 
} 
finally 
{ 
    if (!success) 
    { 
     proxy.Abort(); 
    } 
} 

P.S. Dì al tuo istruttore di guardare "Microsoft: ASMX Web Services are a “Legacy Technology”" e chiedi perché sta insegnando tecnologia obsoleta.

+0

Grazie mille John, sono riuscito a localizzare i metodi in base al tuo esempio. –

-1

scrivere return(secondmethod) all'interno del primo metodo

enter image description here

Problemi correlati