我有一个.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; }
}
很简单然后,我在Postman中配置了一个
POST
请求,如下所示:网址:http://localhost:9090/api/documents
正文:配置为
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)
最佳答案
最后,问题是文件的大小。如果.NET Core抛出错误而不是在发生类似情况时返回200
会很好。我正在尝试上传一些图像,但我需要找出增加文件大小的正确方法,但是当我上传一个小的文本文件时,POST
起作用了,并且该文件已正确地反序列化为。
我相信属性IFormFile
和RequestFormLimits
将最终设置最大文件大小。
关于c# - IFormFile的POST无法生效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54758184/