2017-09-22 9 views
0

est-il possible d'utiliser httpclient pour appeler un service REST à l'intérieur d'une méthode Web ASMX? La bibliothèque httpclient est asynchrone et comme asmx ne supporte pas l'attente asynchrone (TAP), j'ai utilisé .Result pour forcer l'appel à être sync. Cependant, cette fois-ci httpclient ne peut pas faire l'appel avec succès et je reçois activement le serveur distant a refusé l'erreur de connexion. si je cours le même morceau de code dans une application de formulaires de victoire en utilisant async await ou .Result, cela fonctionne très bien.en utilisant httpclient dans asmx webmethod

est-ce un problème avec ASMX WebMethod?

[WebMethod] 
public void Get(){ 

    //Sample (off the top of my head) 
    HttpClient client = new HttpClient(); 
    //more code 
    Task.Run(()=> client.GetDocument()).Result; 

} 

Merci

+0

HttpClient client = new HttpClient(); var tt = Tâche.Run (() => client.GetAsync ("http://immanuel.co")). Résultat; - la variable tt contient maintenant la réponse et sa synchronisation complète – Immanuel

+0

@Immanuel, vous avez fait deux choses que vous ne devriez pas faire dans Asp.Net - '.Result' et' Task.Run() '. [Ne bloquez pas sur le code asynchrone] (https://blog.stephencleary.com/2012/07/dont-block-on-async-code.html) – Crowcoder

Répondre

1

Vous pouvez injecter un module dans le pipeline pour gérer le traitement au lieu du code .asmx réelle. Mais je suggère avant d'aller à la peine, il suffit d'utiliser HttpWebRequest.

Ne pas faire .Result. Ne faites pas Task.Run() dans un contexte Asp.Net.

Le module:

public class Proxy : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     var wrapper = new EventHandlerTaskAsyncHelper(DoAsyncWork); 
     context.AddOnBeginRequestAsync(wrapper.BeginEventHandler, wrapper.EndEventHandler); 
    } 

    async Task DoAsyncWork(object sender, EventArgs e) 
    { 
     // await... anything 
    } 
} 
+0

merci pour la réponse. Comment puis-je utiliser cette classe dans le webmethod asmx? –

+0

Vous enregistrez le module dans web.config ou IIS. Dans le code, vous devrez vérifier si la demande concerne votre service Web, et si c'est le cas, faites votre travail. Sinon, sautez et laissez le pipeline asp continuer. Il y a beaucoup de ressources pour l'utilisation des modules, mais à moins que vous n'ayez vraiment besoin d'aller async pour l'évolutivité, je vous suggère toujours d'utiliser le 'HttpWebRequest' synchrone. – Crowcoder

+0

je comprends. merci beaucoup d'avoir répondu à ma question –