2017-02-27 6 views
2

Ist es möglich, HTTP (s) Post-Anforderung in Azure-Funktion zu erstellen? Ich versuche, einen benutzerdefinierten Webhook zu erstellen, der einen Dienst abhört, und wenn er ausgelöst wird, ruft er einen anderen Dienst über HTTP mit Hilfe von post auf.Azure-Funktionen rufen http Post innerhalb Funktion

Mein Code sieht wie folgt aus:

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

Ich nehme an, das Problem ist, dass derzeit HttpRequestMessage Web-Buchse besetzt und ich kann nicht neue HTTP-Anforderung erstellen.

Fehler, die ich in Ausnahmen Details gefunden:

  • Die zugrunde liegende Verbindung wurde geschlossen: ein unerwarteter Fehler bei einem senden.
  • Daten von der Transportverbindung konnten nicht gelesen werden: Eine bestehende Verbindung wurde vom Remote-Host zwangsweise geschlossen.
  • Sockel Ausnahmefehlercode: 10054
+1

Problem gefunden Standardmäßig wurde keine Unterstützung für TLS 1.2 aktiviert (die von Endpoint I aufgerufen wurde). System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; –

+0

Sie haben Recht; das hat auch für mich funktioniert! –

Antwort

0

Ich habe wie so die HTTP-Post innerhalb Azure Funktion getan:

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

Wie Sie durch den Namen erraten können, ich dies mit schicken eine POST-Anforderung an einem Telegramm bietet

3

Es ist sicherlich möglich, und der folgende Code-Block arbeitet in meiner Testfunktion ganz gut:

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

Es druckt HTML von google.com. POST funktioniert auch: gibt Fehler 405 (Methode nicht zulässig) !! 1 von Google zurück.

Kann es sein, dass Ihr Angerufener versagt?

+2

Es ist erwähnenswert, dass Sie dieses Anti-Pattern beachten sollten, wenn Sie HttpClient in einer Funktion verwenden. https://docs.microsoft.com/en-us/azure/architecture/antipatterns/improper-instantiation/ – Aidos

0

Ich habe gerade einige Stunden selbst damit verbracht, dies zum Laufen zu bringen. Das war in NodeJS. Die Sache, die ich herausgefunden habe, war, dass ich anscheinend einen Endpunkt haben musste, der HTTPS und mit einem gültigen Zertifikat laufen ließ.

Nicht sicher, ob dies irgendwo dokumentiert ist.