我有一个.NET Core应用程序,它具有一个名为Documents
且具有POST
签名的控制器,如下所示:
[HttpPost]
public async Task<IActionResult> PostAsync(CreateDocumentRequest createDocumentRequest)
CreateDocumentRequest
看起来像这样:
public class CreateDocumentRequest
{
public string Name { get; set; }
public string Description { get; set; }
public IFormFile File { get; set; }
}
非常简单。然后,我在邮递员中配置了一个POST
请求,如下所示:
form-data
,并且我在键值对界面中分别配置了Name
,Description
和File
。此外,File
被设置为file
类型,因此它允许我浏览文件。执行此POST
时,DocumentsController
执行构造函数,Application Insights指示PostAsync
已匹配:
激活的事件持续时间线程 应用程序见解:跟踪“与{action =“ PostAsync”,controller =“ Documents”}匹配的路由。执行操作TdlLims.MediaService.Controller.DocumentsController.PostAsync(TdlLims.MediaService)”
但是,它永远不会进入动作。我的直觉告诉我模型绑定失败。这有两个原因。第一,所有其他路由选择工作都根据Application Insights进行。第二,如果我完全删除参数,它将输入操作。我尝试过的:
[FromForm]
添加到了createDocumentRequest
IFormFile
到动作中,将复杂的对象放下CreateDocumentRequest
分成三个不同的参数现在,我怀疑在设置Mvc时,我们可能会丢失某些内容。我们正在配置一些东西,但是我觉得我们某种程度上缺少了multipart/form-data
的格式化程序。我有这种感觉,因为我们使用的是AddMvcCore
而不是AddMvc
:
.AddAuthorization()
.AddJsonFormatters()
.AddApiExplorer()
.AddJsonOptions(options =>
{
options.SerializerSettings.Converters.Add(new OptionConverter());
options.SerializerSettings.Converters.Add(new StringEnumConverter());
});
最后,我可以确认控制器在正常工作,因为我有一个GET
可以访问并且可以执行以下操作:
[HttpGet("{id}")]
public async Task<IActionResult> GetAsync(int id)
答案 0 :(得分:1)
最后,问题是文件的大小。如果.NET Core抛出错误而不是在发生类似情况时返回200
,那就太好了。我试图上传一些图像,但我需要找出增加文件大小的正确方法,但是当我上传一个小的文本文件时,POST
可以正常工作,并且该文件已正确地反序列化为IFormFile
。
我相信属性RequestFormLimits
和RequestSizeLimit
将在最终设置最大文件大小中发挥作用。