IFormFile的POST无法生效

时间:2019-02-19 02:50:37

标签: c# asp.net-mvc asp.net-core .net-core asp.net-core-mvc

我有一个.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请求,如下所示:

  • URL: 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)

1 个答案:

答案 0 :(得分:1)

最后,问题是文件的大小。如果.NET Core抛出错误而不是在发生类似情况时返回200,那就太好了。我试图上传一些图像,但我需要找出增加文件大小的正确方法,但是当我上传一个小的文本文件时,POST可以正常工作,并且该文件已正确地反序列化为IFormFile

我相信属性RequestFormLimitsRequestSizeLimit将在最终设置最大文件大小中发挥作用。