我有一个使用ASP.NET Web Api编写的系统的API,正在尝试扩展它以允许上载图像。我已经进行了一些谷歌搜索,发现使用MultpartMemoryStreamProvider和一些异步方法的推荐方式如何接受文件,但是我对ReadAsMultipartAsync的等待从未返回。
这是代码:

[HttpPost]
public async Task<HttpResponseMessage> LowResImage(int id)
{
    if (!Request.Content.IsMimeMultipartContent())
    {
        throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
    }

    var provider = new MultipartMemoryStreamProvider();

    try
    {
        await Request.Content.ReadAsMultipartAsync(provider);

        foreach (var item in provider.Contents)
        {
            if (item.Headers.ContentDisposition.FileName != null)
            {

            }
        }

        return Request.CreateResponse(HttpStatusCode.OK);
    }
    catch (System.Exception e)
    {
        return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
    }
}
我可以逐步完成以下工作:
await Request.Content.ReadAsMultipartAsync(provider);
在这一点上它将永远不会完成。
我的等待永不回来的原因是什么?
更新
我正在尝试使用curl进行POST到此操作,命令如下:
C:\cURL>curl -i -F filedata=@C:\LowResExample.jpg http://localhost:8000/Api/Photos/89/LowResImage
我也尝试过使用以下html来发布操作,并且发生相同的事情:
<form method="POST" action="http://localhost:8000/Api/Photos/89/LowResImage" enctype="multipart/form-data">
    <input type="file" name="fileupload"/>
    <input type="submit" name="submit"/>
</form>

最佳答案

我在.NET 4.0中遇到了类似问题(没有异步/等待)。使用调试器的线程堆栈,我可以知道ReadAsMultipartAsync正在将任务启动到同一线程上,因此将导致死锁。我做了这样的事情:

IEnumerable<HttpContent> parts = null;
Task.Factory
    .StartNew(() => parts = Request.Content.ReadAsMultipartAsync().Result.Contents,
        CancellationToken.None,
        TaskCreationOptions.LongRunning, // guarantees separate thread
        TaskScheduler.Default)
    .Wait();

TaskCreationOptions.LongRunning参数对我来说很关键,因为没有它,调用将继续将任务启动到同一线程上。您可以尝试使用类似下面的伪代码的代码,以查看它是否适用于C#5.0:
await TaskEx.Run(async() => await Request.Content.ReadAsMultipartAsync(provider))

关于c# - Request.Content.ReadAsMultipartAsync永不返回,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15201255/

10-09 21:52