C#Web API异步上传文件

时间:2017-09-19 00:07:50

标签: c# asynchronous asp.net-web-api file-upload

我尝试创建一个可以运行处理上传过程的异步进程的API,并立即返回,让用户知道文件上传过程已经开始。从这里开始,我想创建一个API来询问上传的状态。

这在网络领域是否可行?如果没有,我必须等到整个文件被处理完毕,该API是否仍可用于多个请求?

到目前为止,这是我的代码,目前它到达帖子中的某个字节并失败。

public async Task<IHttpActionResult> Post()
{
    var stream = HttpContext.Current.Request.GetBufferlessInputStream(true);
    // Begin Upload
    Task.Run(() => BeginUpload(stream));

    //  Return upload begin successful
    return Ok($"Upload started! # {0}");
}

private async Task<int> BeginUpload(Stream stream)
{
    using (var reader = new StreamReader(stream))
    {
        var index = 0;
        var buffer = new char[100000000];

        while (!reader.EndOfStream)
        {
            await reader.ReadBlockAsync(buffer, index, 1024);
            index += 1024;
            Debug.Write($"{index}\n");
        }
    }

    return 0;
}

1 个答案:

答案 0 :(得分:0)

您可以考虑HostingEnvironment.QueueBackgroundWorkItem而不是使用Task.Run()。例如:

public IHttpActionResult Post()
    {
        var stream = HttpContext.Current.Request.GetBufferlessInputStream(true);
        // Begin Upload
        HostingEnvironment.QueueBackgroundWorkItem(async cancellationToken => await BeginUpload(stream));

        //  Return upload begin successful
        return Ok($"Upload started! # {0}");
    }

    private async Task BeginUpload(Stream stream)
    {
        using (var reader = new StreamReader(stream))
        {
            var index = 0;
            var buffer = new char[100000000];

            while (!reader.EndOfStream)
            {
                await reader.ReadBlockAsync(buffer, index, 1024);
                index += 1024;
                Debug.Write($"{index}\n");
            }
        }
    }

在这种情况下,您不必等到读者完成其工作。