我有一个外部服务,将电子邮件作为表单数据发送到MVC 5 WebApi端点。由于字段可以更改,我尝试将POST主体作为ReadAsNameValueCollection
接收。当我调用recipient=test%40example.com&sender=user%40gmail.com&subject=subject&from=UserName+%3Cuser%40gmail.com%3E
方法时,结果与POSTed数据不一致。
例如,原始表单数据的开头如下所示:
recipient = test@example.com
sender = user@gmail.com
subject = subject
from = UserName <user@gmail.com>
经过一些URL解码后,值应该:
NameValueCollection
但是当我转换为subject = subject,subject
from = UserName <user@gmail.com>,UserName <user@gmail.com>
并迭代键和值时,会返回几个值作为由逗号分隔的两个数据副本:
subject
我的测试电子邮件中有26个字段(例如,如果有附件,则会有所不同),此问题仅影响from
和public async Task<IHttpActionResult> ReceiveEmail(FormDataCollection postBody)
{
NameValueCollection email = postBody.ReadAsNameValueCollection();
// Debug: dump key/vals
StringBuilder sb = new StringBuilder();
foreach(string key in email.AllKeys) sb.AppendLine($"{key} == {email[key]}");
await BlobWriter.Write("debug-container", "email.txt", sb.ToString());
return Ok();
}
字段,如上所示 - 这些只是纯文本,没有什么特别之处。
有人知道导致这种情况的原因或如何避免吗?
编辑:发布代码,但我之前没有打扰,因为它实际上就像获取输入参数和转换一样简单。 (BlobWriter只是一个将字符串写入Azure blob存储的辅助类。)
FormDataCollection
编辑2:我还应该注意,从postBody.Get("subject")
请求特定的键/值(而不是迭代地转储它们)确认了不正确的内容。例如,subject,subject
会产生 $(document).ready(function() {
$('#calendar').fullCalendar({
themeSystem: 'bootstrap3',
firstDay: 1,
footer: {
right: 'month basicWeek listDay'
}
});
});
作为存储值。