Функции Azure - как читать данные формы

Как читать данные формы в функциях Azure? Я пытался сделать это несколькими способами, но всегда получаю ошибку, например:

using System.Net;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    dynamic data = await req.Content.ReadAsFormDataAsync();

    return req.CreateResponse(HttpStatusCode.OK, $" {data}");
}

Ошибка: Exception while executing function: Functions.FormTrigger. System.Net.Http.Formatting: No MediaTypeFormatter is available to read an object of type 'FormDataCollection' from content with media type 'application/json'.

Я проверил содержание запроса и получаю запрос как multipart/form-data:

" ------WebKitFormBoundary47wKq7pk9Fcc4H9J\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nsdgs\r\n
------WebKitFormBoundary47wKq7pk9Fcc4H9J\r\nContent-Disposition: form-data; name=\" _replyto\"\r\n\r\[email protected]\r\n
------WebKitFormBoundary47wKq7pk9Fcc4H9J\r\nContent-Disposition: form-data; name=\"message\"\r\n\r\nsdgsd\r\n
------WebKitFormBoundary47wKq7pk9Fcc4H9J--\r\n"

Спасибо за любые подсказки.


person Pawel Maga    schedule 15.12.2016    source источник
comment
Какой тип содержимого запроса? То есть, будет ли это - application / x-www-form-urlencoded, или у вас есть содержимое application / json? ReadAsFormDataAsync принимает только содержимое типа application / x-www-form-urlencoded.   -  person Nirman    schedule 15.12.2016
comment
@Nirman Я пробовал, и он работает, но всегда получаю пустой результат из выражений, например: data [message]   -  person Pawel Maga    schedule 15.12.2016
comment
Можете попробовать прочитать - req.Content.ReadAsFormDataAsync (). Result? Это должно дать вам коллекцию имени-значения   -  person Nirman    schedule 15.12.2016
comment
@Nirman Он возвращает мне что-то вроде этого: pastebin.com/vnKsQQCb :( Я думаю, это сильно связано с Функциями Azure ...   -  person Pawel Maga    schedule 15.12.2016
comment
кажется странным! последний шаг с моей стороны - NameValueCollection col = req.Content.ReadAsFormDataAsync (). Result; return req.CreateResponse (HttpStatusCode.OK, $ {col [0]});   -  person Nirman    schedule 15.12.2016
comment
@Nirman Я понял, в чем проблема. Ваш первый комментарий был правильным ... Я тестировал его с помощью Postman, и данные формы были в разделе form-data вместо раздела x-www-form-urlencoded. К сожалению, мой заголовок был проигнорирован. Опубликуйте его как ответ, и я отмечу его как ответ. Большое спасибо!   -  person Pawel Maga    schedule 15.12.2016


Ответы (2)


Поскольку запрос содержит тип содержимого «application / x-www-form-urlencoded», вам необходимо преобразовать ввод в NameValueCollection, чтобы прочитать ввод:

NameValueCollection col = req.Content.ReadAsFormDataAsync().Result; 
return req.CreateResponse(HttpStatusCode.OK, $" {col[0]}");

Вы также можете передать ключевую строку вместо индекса, что сделает код более читаемым и понятным.

person Nirman    schedule 15.12.2016

Для чтения данных формы существует метод ReadAsMultipartAsync:

data = await req.Content.ReadAsMultipartAsync().ConfigureAwait(false);
person Majix    schedule 01.03.2019