4 votes

appel de service Web asynchrone. Aucune méthode (Begin...) disponible !

Je sais que cette question a déjà été abordée, mais j'ai un service qui renvoie une chaîne de caractères comme ceci.

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]
public class MyService : System.Web.Services.WebService
{

    [WebMethod]
    public string Hello()
    {
        System.Threading.Thread.Sleep(10000);
        return "Hello User";
    }
}

J'ai lu de nombreux exemples qui disent que je dois appeler la méthode comme ceci :

        MyService my = new MyService();
        AsyncCallback async = new AsyncCallback(callback);
        my.BeginHello();
        Console.WriteLine("Called webservice");

Le problème est que lorsque j'ai ajouté la référence, je n'ai pas pu obtenir la méthode BeginHello. Tout ce que j'ai vu, c'est la méthode HelloAsync. Je l'ai donc utilisé comme ceci dans mon application console.

        MyService my = new MyService();
        AsyncCallback async = new AsyncCallback(callback);
        my.HelloAsync();
        Console.WriteLine("Called webservice");

et défini une méthode de rappel privée comme ceci

    private void callback(IAsyncResult res)
    {
        Console.Write("Webservice finished executing.");
    }

En faisant cela, j'obtiens une erreur comme celle-ci :

A le champ non statique, la méthode ou la propriété 'AsyncWebserviceCall.Program.callback(System.IAsyncResult)

Pourquoi je n'obtiens pas la méthode BeginHello et pourquoi j'obtiens cette erreur comme ci-dessus ?

Merci pour votre temps.

9voto

Kev Points 60744

Si le code est exécuté dans votre public static void Main(string[] args) alors vous devez faire private void callback(IAsyncResult res) une méthode statique :

private static void callback(IAsyncResult res)
{
    Console.Write("Webservice finished executing.");
}

C'est pourquoi vous obtenez cette erreur.

À partir de la version 2.0 d'ASP.NET, des modifications ont été apportées à la manière d'effectuer des appels de services Web asynchrones. Faites plutôt ceci :

MyService my = new MyService();
my.HelloCompleted += CallBack;
my.HelloAsync();
Console.WriteLine("Called service.");
Console.ReadLine();  // Wait, otherwise console app will just exit.

La signature de votre méthode de rappel devient :

private static void CallBack(object sender, HelloCompletedEventArgs e)
{
    Console.WriteLine("Webservice finished executing.");
}

Plus d'informations :

À partir de Visual Studio 2005, le générateur de proxy Ajouter une référence Web ne crée plus l'icône BeginXXX/EndXXX méthodes. Ces méthodes ont été dépréciées au profit de l'option XXXAsync/XXXCompleted modèle.

Si vous avez vraiment besoin de travailler avec le BeginXXX/EndXXX Pour les méthodes asynchrones de style, vous pouvez utiliser l'une des méthodes suivantes :

  1. Utilisez le WSDL.exe pour créer le proxy. Par exemple :

    wsdl.exe /out:MyService.cs http://somedomain.com/MyService.asmx?wdsl

    Inclure les données générées MyService.cs dans votre projet et utilisez-le à la place d'une référence Web. Pour ce faire, vous devez ouvrir une invite de commande Visual Studio afin que les binaires .NET Framework SDK se trouvent dans votre chemin.

  2. Il existe apparemment un hack dans Visual Studio (il n'est peut-être plus disponible). Pour plus d'informations, voir ce cas MS Connect :

Méthodes Begin/End Async WebService Proxy non générées dans les projets d'applications Web

Mon conseil serait d'adopter la nouvelle approche.

2voto

user20358 Points 3015

Voici ce que j'ai changé du côté client pour que cela fonctionne.

    static void Main(string[] args)
    {
        MyService my = new MyService();
        my.HelloCompleted +=new HelloCompletedEventHandler(my_HelloCompleted);
        my.HelloAsync();
        Console.WriteLine("Called webservice");
        Console.ReadKey();

    }

    private static void my_HelloCompleted(object sender, HelloCompletedEventArgs e)
    {
        Console.Write("Webservice finished executing in my_HelloCompleted.");
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X