2009-08-03 12 views
22

J'ai un service Web qui contient cette méthode:Comment appeler une méthode de service 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; 
} 

Ceci retourne une liste de noms de fichiers dans un dossier. Quand je débogue l'application, cela fonctionne très bien.

Ce que je veux faire, est d'appeler cette méthode webservice à partir d'une application winform. J'ai ajouté une référence au .dll du webservice, et voici comment j'appelle la méthode ci-dessus:

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

Le code ci-dessus ne fonctionne pas - quand il entre dans la méthode, le chemin de l'application Web est nulle , et beaucoup de propriétés de la classe HostingEnvironment sont également null. Où est mon erreur, en essayant d'appeler une méthode de service Web à partir d'une autre application winform?

Veuillez noter que le service Web est créé dans Visual Web Developer Express et la forme winform dans Visual C# express; C'est pourquoi j'ai dû ajouter le service web dll comme référence dans l'application winform. Je n'ai pas Visual Studio complet, ce qui m'aurait permis une solution unique avec les deux projets.

Je suis nouveau sur les services Web.

PS - j'aime la mise en forme du texte à la volée ici :)

Répondre

18

en studio visuel, utilisez la fonction « Ajouter une référence Web » puis entrez dans l'URL de votre service Web. En ajoutant une référence à la DLL, vous ne la référencez pas en tant que service Web, mais simplement en tant qu'assemblage. Lorsque vous ajoutez une référence Web, créez une classe proxy dans votre projet qui a des méthodes/arguments identiques ou similaires à ceux de votre service Web. Cette classe proxy communique avec votre service Web via SOAP mais masque tous les éléments du protocole de communication afin que vous n'ayez pas à vous en soucier.

+0

Superbe - merci beaucoup! J'ai maintenant enlevé le ref de dll, et ai ajouté une référence de service à l'URL. J'ai cependant remarqué qu'il ne me donne pas un accès direct à ma méthode, à la place j'ai accès à des classes appelées: GetFileListOnWebServerRequest, GetFileListOnWebServerRequestBody, GetFileListOnWebServerResponse, GetFileListOnWebServerResponseBody.Y at-il une ressource web que je peux lire concernant ces classes autogénérées? Je ne sais pas comment les utiliser. –

+0

Il génère beaucoup de parties, mais il suffit de rechercher la méthode GetFileListOnWebServer elle-même. –

+1

En fait, regardez l'exemple de John. –

1

La réponse de James est correcte, bien sûr, mais je dois vous rappeler que toute la chose ASMX est, sinon obsolète, du moins pas la méthode actuelle. Je suggère fortement que vous regardiez dans WCF, si seulement pour éviter d'apprendre des choses que vous devrez oublier.

+0

Merci pour votre réponse, Steven! Je vais certainement me pencher sur la WCF. Cependant, comme pour cette tâche, c'est un "devoirs" d'affectation, donc on m'a dit d'utiliser asmx :) Salut! –

+0

Ok, mais s'il s'agit de devoirs, merci de le marquer comme tel. J'ai pris la liberté de le faire pour vous. –

10

La méthode actuelle consiste à utiliser la commande "Ajouter une référence de service". Si vous spécifiez "TestUploaderWebService" comme nom de référence de service, cela générera le type TestUploaderWebService.Service1. Cette classe aura une méthode nommée GetFileListOnWebServer, qui retournera un tableau de chaînes (vous pouvez changer cela pour être une liste de chaînes si vous voulez). Vous l'utiliser comme ceci:

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(); 
    } 
} 

post-scriptum Dites à votre instructeur de regarder "Microsoft: ASMX Web Services are a “Legacy Technology”", et demandez pourquoi il enseigne la technologie obsolète.

+0

Merci beaucoup John, j'ai réussi à localiser les méthodes basées sur votre exemple. –

-1

écrire return(secondmethod) à l'intérieur de la première méthode

enter image description here

Questions connexes