IFormFile在执行异步操作时被释放

Ket*_*tan 0 c# async-await asp.net-web-api asp.net-core

我有一个ASP.Net Core 2.0 webapi代码,如下所示

public class TestController : Controller
{
    private readonly ISampleRepository _sampleRepository = new SampleRepository();

    [HttpPost("{id}")]
    public async void Post([FromRoute]int id, IEnumerable<IFormFile> files, [FromForm] NotifyViewModel model)
    {
        // get data from DB using async
        var dbData = await _sampleRepository.GetAsync(id);

        //check if email alert is enabled 
        if(dbData.IsEmailEnabled)
        {
            //create MailMessage
            var mailMessage = new MailMessage() { 
                //options here 
                };

            foreach (var formFile in files)
            {
                mailMessage.Attachments.Add(new Attachment(formFile.OpenReadStream(), formFile.FileName, formFile.ContentType));
            }

            // send email
            _emailHelper.SendEmail(mailMessage);
        }
    }
}

public class SampleRepository 
{
    public async Task<SampleData> GetAsync(int id)
    {
        //get data using Dapper & return
        var result = await con.QuerySingleAsync<SampleData>(sql, new {id = id}, null, null, CommandType.Text);

        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)


当我将数据发布到此端点时,我得到例外说法'Cannot access disposed object.'(参见屏幕截图)

在此输入图像描述

但是,当我通过执行以下代码更改使DB操作同步时,它会以某种方式工作而不会出现任何错误.

// Removed
// var dbData = await _sampleRepository.GetAsync(id);

// Newly added. Made DB operations synchronous
var dbData = _sampleRepository.GetAsync(id).Result; 
Run Code Online (Sandbox Code Playgroud)


有人可以帮我理解这种行为吗?当涉及异步操作时,为什么HTTP发布文件会被丢弃?

Pau*_*ado 5

因为你的方法是async void它一击到第一个就立即返回await.当代码访问请求数据时,请求已经结束.

改变的签名Postasync void Postasync Task Post作为async Task是同步的异步类似物void.