我有一个.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,并且我在键值对界面中分别配置了NameDescriptionFile。此外,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起作用了,并且该文件已正确地反序列化为。

我相信属性IFormFileRequestFormLimits将最终设置最大文件大小。

关于c# - IFormFile的POST无法生效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54758184/

10-13 01:01