C# 如何使用Azure函数解析表单数据
我试图在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
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这是一个很好的起点: