2017-11-28 4 views
0

ich die sehr einfache Azure HTTP ausgelöst Funktion haben, die eine POST mit den Daten empfängt:ein Array an einer Azure-Funktion HTTP-Trigger Posting zurückkehrt einen 500-Statuscode

{ 
    "symbols": ["Azure1", "Azure2", "Azure3"] 
} 

Und meine Azure Funktion ist:

#r "Newtonsoft.Json" 
using System.Net; 
using System.Linq; 
using System.Net.Http; 
using System.Net.Http.Formatting; 
using System.Net.Http.Headers; 
using Newtonsoft.Json; 
using Newtonsoft.Json.Linq; 

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log) 
{ 
    log.Info("C# HTTP trigger function processed a request."); 

    // parse query parameter 
    string symbols = req.GetQueryNameValuePairs() 
     .FirstOrDefault(q => string.Compare(q.Key, "symbol", true) == 0) 
     .Value; 

    // Get request body 
    dynamic data = await req.Content.ReadAsAsync<object>(); 

    // Set name to query string or body data 
    symbols = symbols ?? data?.symbols; 

    return symbols == null 
     ? req.CreateResponse(HttpStatusCode.BadRequest, "Please pass a name on the query string or in the request body") 
     : req.CreateResponse(HttpStatusCode.OK, symbols, JsonMediaTypeFormatter.DefaultMediaType); 
} 

Allerdings erhalte ich eine 500-Antwort mit der Fehlermeldung: Cannot implicitly convert type 'Newtonsoft.Json.Linq.JArray' to 'string'. An explicit conversion exists (are you missing a cast?).

Hat jemand sehen, wo Ich könnte hier falsch liegen? Meine Erwartung ist, dass die Funktion Antwort wäre:

["Azure1", "Azure2", "Azure3"] 

Antwort

1

Der Fehler macht Sinn. Sie deklarieren symbols als string, aber Sie später zuweisen data?.symbols, es ist ein Array. Daher die Nachricht Cannot implicitly convert type 'Newtonsoft.Json.Linq.JArray' to 'string'.

Sofern Sie die Übergabe von Daten über die Abfragezeichenfolge nicht unterstützen möchten, sollten Sie diese Abfragezeichenfolgenlogik einfach entfernen. z.B. versuchen Sie dies:

#r "Newtonsoft.Json" 
using System.Net; 
using System.Net.Http; 
using System.Net.Http.Formatting; 
using Newtonsoft.Json.Linq; 

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log) 
{ 
    dynamic data = await req.Content.ReadAsAsync<object>(); 
    JArray symbols = data?.symbols; 

    return symbols == null 
     ? req.CreateResponse(HttpStatusCode.BadRequest, "Please pass symbols in the body") 
     : req.CreateResponse(HttpStatusCode.OK, symbols, JsonMediaTypeFormatter.DefaultMediaType); 
} 
+0

Ich finde die standardmäßige automatisch generierte C# -Funktion ein bisschen verwirrend. Es liest sowohl Query als auch Body, benutzt 'object' und' dynamic' - einfach kein gutes Beispiel für Anfänger. Das Gleiche gilt für F #. – Mikhail

+0

Danke @David. Das hat es getan. Und Mikhail, stimme ich voll und ganz zu! – Brett

+0

Ein bisschen ein Nebenthema aus dem Typkonvertierungsproblem. Es könnte sein, dass die Standardvorlage in der Tat verwirrend ist. Es versucht, mehrere Techniken zu demonstrieren, weshalb es sowohl die Abfragezeichenfolge als auch den Text abfragt. Aber das macht es komplexer. Wir können dies zu https://github.com/Azure/azure-webjobs-sdk-templates/issues für weitere Diskussionen nehmen. –