Отправка массива в триггер HTTP функции Azure возвращает код состояния 500

У меня есть очень простая функция, запускаемая через Azure HTTP, которая получает POST с данными:

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

И моя функция Azure:

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

Тем не менее я получаю ответ 500 с сообщением об ошибке: Cannot implicitly convert type 'Newtonsoft.Json.Linq.JArray' to 'string'. An explicit conversion exists (are you missing a cast?).

Кто-нибудь видит, где я могу пойти не так? Я ожидаю, что ответ функции будет:

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

1 ответ

Решение

Ошибка имеет смысл. Вы декларируете symbols как string, но вы позже назначаете data?.symbols к нему, который является массивом. Отсюда и сообщение Cannot implicitly convert type 'Newtonsoft.Json.Linq.JArray' to 'string',

Если вы не хотите поддерживать передачу данных через строку запроса, вам следует просто избавиться от логики этой строки запроса. например попробуйте это:

#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);
}
Другие вопросы по тегам