C# 如何使用Azure函数解析表单数据

C# 如何使用Azure函数解析表单数据,c#,function,azure,sendgrid,C#,Function,Azure,Sendgrid,我试图在Azure函数中获取表单数据 public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log) { log.Info("C# HTTP trigger function processed a request."); NameValueCollection col = req.Content.ReadAsFormDataAsync().Resul

我试图在Azure函数中获取表单数据

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    log.Info("C# HTTP trigger function processed a request.");
    NameValueCollection col = req.Content.ReadAsFormDataAsync().Result;   
    return req.CreateResponse(HttpStatusCode.OK, "OK");
}
公共静态异步任务运行(HttpRequestMessage请求,TraceWriter日志)
{
Info(“C#HTTP触发器函数处理了一个请求。”);
NameValueCollection col=req.Content.ReadAsFormDataAsync().Result;
返回请求CreateResponse(HttpStatusCode.OK,“OK”);
}
我得到以下错误:

执行函数时出现异常:System.Net.Http.Formatting:没有MediaTypeFormatter可用于从媒体类型为“multipart/form data”的内容中读取“FormDataCollection”类型的对象

我正在尝试通过SendGrid解析入站电子邮件,如下所述。

传入的请求看起来是正确的

--xYzZY 内容配置:表单数据;name=“附件”

0 --xYzZY 内容配置:表单数据;name=“text”

你好,世界 --xYzZY 内容配置:表单数据;name=“主题”

主题 --xYzZY
内容配置:表单数据;name=“to”

根据错误消息,您正在使用多部分/表单数据作为请求内容类型。但您尚未将任何媒体类型的数据发布到服务器

如果您只想向服务器发送一些普通数据,可以将内容类型更改为application/x-www-form-urlencoded,并按照以下格式修改请求正文

name=attachments&anothername=anothervalue
如果希望从多部分post获取表单数据,可以使用MultipartFormDataStreamProvider

string filePath = "set a temp path to store the uploaded file";
var provider = new MultipartFormDataStreamProvider(filePath);
var multipartProvider = await req.Content.ReadAsMultipartAsync(provider);
var formData = multipartProvider.FormData;
手动解析请求主体的内容

string content = await req.Content.ReadAsStringAsync();
string formdata = content.Split(';')[1];
string[] namevalues = formdata.Split('&');
NameValueCollection col = new NameValueCollection();
foreach (string item in namevalues)
{
    string[] nameValueItem = item.Split('=');
    col.Add(nameValueItem[0], nameValueItem[1]);
}

要读取表单数据,应使用ReadAsMultipartAsync方法:

data = await req.Content.ReadAsMultipartAsync().ConfigureAwait(false);

由于将
IFormCollection
转换为自定义模型/视图模型类型似乎不是一个好方法,因此我为此编写了一个扩展方法

很遗憾,Azure功能v2/v3还不支持这种开箱即用的功能

公共静态类FormCollectionExtensions
{
/// 
///尝试将表单集合绑定到类型为的模型。
/// 
///模型类型。必须具有公共无参数构造函数。
///要绑定的表单数据。
///包含表单数据的类型的新实例。
公共静态T BindToModel(此集合表单),其中T:new()
{
var props=typeof(T).GetProperties();
var instance=Activator.CreateInstance();
var formKeyMap=form.Keys.ToDictionary(k=>k.ToUpper(),k=>k);
foreach(道具中的var p)
{
if(p.CanWrite&&formKeyMap.ContainsKey(p.Name.ToUpper()))
{
p、 SetValue(实例,表单[formKeyMap[p.Name.ToUpper()]].FirstOrDefault());
}
}
返回实例;
}
}
这将尝试将
IFormCollection
绑定到您传入的任何模型类型。属性名不区分大小写(即,您可以将
firstname=Bob
映射到
公共字符串firstname{get;set;}

用法:

var myModel=(等待httpReq.ReadFormAsync()).BindToModel();

我更新了我的答案,以提供一种从多部分请求中获取表单数据的方法。谢谢,但在这种情况下,也没有上传的文件指向。由于请求正文的格式不符合application/x-www-form-urlencoded和multipart/form data,我建议您使用string content=wait req.content.ReadAs读取正文的内容StringAsync();并自行解析内容。我将修改回复以提供详细代码。如何使其支持Guid解析?@BartCalixto这是一个很好的起点: