Question

Je consomme une ressource tierce (un fichier .dll) dans un service Web et mon problème est que l'appel de cette ressource (appel d'une méthode) est effectué de manière asynchrone - je dois m'abonner à un événement pour obtenir la réponse à ma demande. Comment puis-je faire cela dans un service Web c #?

Mise à jour:

En ce qui concerne la réponse de Sunny :

Je ne souhaite pas rendre mon service Web asynchrone.

Était-ce utile?

La solution

Si le composant tiers ne prend pas en charge le modèle de programmation asynchrone standard (c’est-à-dire qu’il n’utilise pas IAsyncResult), vous pouvez toujours effectuer la synchronisation à l’aide de AutoResetEvent ou ManualResetEvent. Pour ce faire, déclarez un champ de type AutoResetEvent dans votre classe de service Web:

AutoResetEvent processingCompleteEvent = new AutoResetEvent();

Attendez ensuite que l'événement soit signalé après avoir appelé le composant tiers

// call 3rd party component
processingCompleteEvent.WaitOne()

Et dans le gestionnaire d'événements de rappel, signalez à l'événement de laisser le thread en attente continuer l'exécution:

 processingCompleteEvent.Set()

Autres conseils

En supposant que votre composant tiers utilise le modèle de modèle de programmation asynchrone utilisé dans le .NET Framework, vous pouvez procéder de la sorte

.
    HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("http://www.stackoverflow.com");
    IAsyncResult asyncResult = httpWebRequest.BeginGetResponse(null, null);

    asyncResult.AsyncWaitHandle.WaitOne();

    using (HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.EndGetResponse(asyncResult))
    using (StreamReader responseStreamReader = new StreamReader(httpWebResponse.GetResponseStream()))
    {
        string responseText = responseStreamReader.ReadToEnd();
    }

Etant donné que votre opération de service Web doit être bloquée, vous devez utiliser IAsyncResult.AsyncWaitHandle au lieu du rappel à bloquer jusqu'à la fin de l'opération.

De la documentation MSDN :

using System;
using System.Web.Services;

[WebService(Namespace="http://www.contoso.com/")]
public class MyService : WebService {
  public RemoteService remoteService;
  public MyService() {
     // Create a new instance of proxy class for 
     // the XML Web service to be called.
     remoteService = new RemoteService();
  }
  // Define the Begin method.
  [WebMethod]
  public IAsyncResult BeginGetAuthorRoyalties(String Author,
                  AsyncCallback callback, object asyncState) {
     // Begin asynchronous communictation with a different XML Web
     // service.
     return remoteService.BeginReturnedStronglyTypedDS(Author,
                         callback,asyncState);
  }
  // Define the End method.
  [WebMethod]
  public AuthorRoyalties EndGetAuthorRoyalties(IAsyncResult
                                   asyncResult) {
   // Return the asynchronous result from the other XML Web service.
   return remoteService.EndReturnedStronglyTypedDS(asyncResult);
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top