2009-08-03 25 views
22

Tengo un servicio web que contiene este método:¿Cómo llamar a un método de servicio 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; 
} 

Esto devuelve una lista de nombres de archivos en una carpeta. Cuando depuro la aplicación, funciona bien.

Lo que quiero hacer es llamar a este método de servicio web desde una aplicación winform. He añadido una referencia a la DLL del servicio web, y así es como yo llamo el método anterior:

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

El código anterior no funciona - cuando entra en el método, el camino de la aplicación web es nulo y muchas propiedades de la clase HostingEnvironment también son nulas. ¿Dónde está mi error al tratar de llamar a un método de servicio web desde otra aplicación winform?

Tenga en cuenta que el servicio web se realiza en Visual Web Developer Express, y el winform en Visual C# express; Es por eso que tuve que agregar el dll del servicio web como referencia en la aplicación winform. No tengo Visual Studio completo, lo que me hubiera permitido una solución única para ambos proyectos.

Soy nuevo en servicios web.

PS - Me encanta el formato del texto en la marcha aquí :)

Respuesta

18

En Visual Studio, utilice la función "Agregar referencia Web" y luego entrar en el URL de su servicio web.

Al agregar una referencia a la DLL, no hace referencia a ella como un servicio web, sino simplemente como un ensamblado.

Cuando agrega una referencia web, crea una clase proxy en su proyecto que tiene los mismos métodos o argumentos similares que su servicio web. Esa clase proxy se comunica con su servicio web a través de SOAP, pero oculta todo el protocolo de comunicaciones para que no tenga que preocuparse por ello.

+0

Excelente - muchas gracias! Ahora eliminé el dll ref y agregué una referencia de servicio a la URL. Sin embargo, he notado que no me da acceso directo a mi método, en cambio tengo acceso a clases llamadas: GetFileListOnWebServerRequest, GetFileListOnWebServerRequestBody, GetFileListOnWebServerResponse, GetFileListOnWebServerResponseBody.¿Hay algún recurso web que pueda leer sobre estas clases autogeneradas? No sé cómo usar estos. –

+0

Genera muchas partes, pero solo busca el método GetFileListOnWebServer. –

+1

En realidad, solo mira el ejemplo de John. –

1

La respuesta de James es correcta, por supuesto, pero debo recordarle que todo lo de ASMX es, si no obsoleto, al menos no el método actual. Sugiero encarecidamente que estudie WCF, aunque solo sea para evitar aprender cosas que deberá olvidar.

+0

¡Gracias por tu respuesta, Steven! Ciertamente miraré hacia WCF. Sin embargo, en cuanto a esta tarea, es una asignación de "tarea", así que me dijeron que use asmx :) ¡Salud! –

+0

Ok, pero si es tarea, por favor marque como tal. Me he tomado la libertad de hacer esto por ti. –

10

La forma actual de hacerlo es mediante el uso del comando "Agregar referencia de servicio". Si especifica "TestUploaderWebService" como el nombre de referencia del servicio, generará el tipo TestUploaderWebService.Service1. Esa clase tendrá un método llamado GetFileListOnWebServer, que devolverá una matriz de cadenas (puede cambiar eso para que sea una lista de cadenas si lo desea). Se podría utilizar de esta manera:

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ígale a su instructor que mire "Microsoft: ASMX Web Services are a “Legacy Technology”", y pregunte por qué está enseñando tecnología obsoleta.

+0

Muchas gracias John, he logrado localizar los métodos basados ​​en su ejemplo. –

-1

escribir return(secondmethod) interior del primer método

enter image description here

Cuestiones relacionadas