我有一个 web api,其中包含一些应该同时接收数据和文件的操作。为此,我接受 multipart/form-data 而不是 JSON 并使用[FromForm]以下方法绑定到模型:
[Authorize(Policy = "MyCustomPolicy")]
public async Task<IActionResult> Create([FromForm]MyCustomDto myDto)
{
// Do some stuff here
}
public class MyCustomDto
{
public int Id { get; set; }
public string Title { get; set; }
public IEnumerable<IFormFile> Attachments { get; set; }
}
这工作正常并且正确绑定到 DTO。
使用 AuthorizationHandler 检查和强制执行策略,它也可以正常工作。
在上述 AuthorizationHandler 中,我需要访问一些传递给控制器的东西,例如路由中的 ID 或 DTO。使用 访问路线数据非常容易authContext.RouteData.Values["nameOfIdField"]。
但是,对于正文,我创建了一个辅助扩展方法,用于读取正文流并将其反序列化:
public static async Task<T> DeserializeBody<T>(this AuthorizationFilterContext context, string name)
{
var content = string.Empty;
using(var reader = new StreamReader(context.HttpContext.Request.Body, System.Text.Encoding.UTF8, true, 1024, true))
{
content = await reader.ReadToEndAsync();
reader.BaseStream.Seek(0, SeekOrigin.Begin);
}
if (string.IsNullOrWhiteSpace(content))
{
return default(T);
}
return JsonConvert.DeserializeObject<T>(content);
}
同样,这也很好用。但是,现在我遇到了 DTO 的问题,这些 DTO 不是作为 JSON 传递的,而是 - 正如开头所说的 - 作为表单数据。
正文的内容不是可以轻松序列化的 JSON:
-----------------------------7e2b13b820d4a
Content-Disposition: form-data; name="id"
232
-----------------------------7e2b13b820d4a
Content-Disposition: form-data; name="title"
test
-----------------------------7e2b13b820d4a
Content-Disposition: form-data; name="attachments"; filename="C:\Temp\Test.jpg"
Content-Type: image/jpeg
有什么方法可以轻松地将它绑定到我的 DTO,而无需手动解析它?
BIG阳
慕哥9229398
相关分类