2017-02-27 1 views
2

Est-il possible de créer une requête HTTP dans une fonction Azure? J'essaie de créer un webhook personnalisé qui écoute un service et quand il est déclenché, il appelle un autre service via HTTP en utilisant post.Azure Fonctions appelez http poste à l'intérieur de la fonction

Mon code ressemble à ça:

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log) 
{ 

    BitbucketRequest data = await req.Content.ReadAsAsync<BitbucketRequest>(); 
    //DO STH WITH DATA TO GET e.g. USER STORY ID 

    using(var client = new HttpClient()){ 
     client.BaseAddress = new Uri("https://SOME_TARGETPROCESS_URL/api/v1"); 
     var body = new { EntityState = new { Id = 174 } }; 
     var result = await client.PostAsJsonAsync(
         "/UserStories/7034/?resultFormat=json&access_token=MYACCESSTOKEN", 
         body); 
     string resultContent = await result.Content.ReadAsStringAsync(); 
    } 

    return req.CreateResponse<string>(HttpStatusCode.OK,"OKOK"); 
} 

Je suppose que le problème est que actuellement HttpRequestMessage occupe socket web et je ne peux pas créer de nouvelles Demande de Http.

erreurs que je trouve dans les détails Exceptions:

  • La connexion sous-jacente a été fermée: Une erreur inattendue est survenue sur un envoi.
  • Impossible de lire les données de la connexion de transport: une connexion existante a été fermée de force par l'hôte distant.
  • Socket Exception Code d'erreur: 10054
+1

Trouvé le problème Par défaut, aucun support pour TLS 1.2 a été activé (qui était utilisé par le point de terminaison que j'appelais). System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; –

+0

Vous avez raison; Cela a aussi fonctionné pour moi! –

Répondre

0

je l'ai fait le poste HTTP dans Azure Fonction comme ceci:

using System.Net; 
using System.Net.Http; 
using System.Net.Http.Headers; 
using System.Text; 
using Newtonsoft.Json; 

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, string arg1, string arg2, string arg3, TraceWriter log) 
{ 
    log.Info("C# HTTP trigger function processed a request."); 
    var text = String.Format("arg1: {0}\narg2: {1}\narg3: {2}", arg1, arg2, arg3); 
    log.Info(text); 

    var results = await SendTelegramMessage(text); 
    log.Info(String.Format("{0}", results)); 

    return req.CreateResponse(HttpStatusCode.OK); 
} 

public static async Task<string> SendTelegramMessage(string text) 
{ 
    using (var client = new HttpClient()) 
    { 

     Dictionary<string, string> dictionary = new Dictionary<string, string>(); 
     dictionary.Add("PARAM1", "VALUE1"); 
     dictionary.Add("PARAM2", text); 

     string json = JsonConvert.SerializeObject(dictionary); 
     var requestData = new StringContent(json, Encoding.UTF8, "application/json"); 

     var response = await client.PostAsync(String.Format("url"), requestData); 
     var result = await response.Content.ReadAsStringAsync(); 

     return result; 
    } 
} 

Comme vous pouvez le deviner par le nom, je suis en utilisant cette option pour envoyer une requête POST à ​​un bot télégramme

3

Il est certainement possible et le bloc de code suivant fonctionne très bien dans ma fonction de test:

using(var client = new HttpClient()) 
{ 
    client.BaseAddress = new Uri("https://www.google.com"); 
    var result = await client.GetAsync(""); 
    string resultContent = await result.Content.ReadAsStringAsync(); 
    log.Info(resultContent); 
} 

Imprime le code HTML de google.com. POST fonctionne également: renvoie l'erreur 405 (méthode non autorisée) !! 1 de google.

Peut-être que votre callee échoue?

+2

Il convient de souligner que vous devez être conscient de cet anti-pattern lorsque vous utilisez HttpClient dans une fonction. https://docs.microsoft.com/fr-fr/azure/architecture/antipatterns/improper-instantiation/ – Aidos

0

Je viens juste de passer plusieurs heures à essayer de faire fonctionner ça. C'était dans NodeJS. La chose que j'ai compris, c'est que je devais apparemment avoir un point de terminaison exécutant HTTPS, et avec un certificat valide.

Je ne sais pas si cela est documenté nulle part.