我有一个使用 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);
到那时它永远不会完成。
我的 await 永远不会返回的原因是什么?
更新
我正在尝试使用 curl POST 到此操作,命令如下:
C:\cURL>curl -i -F filedata=@C:\LowResExample.jpg http://localhost:8000/Api/Photos/89/LowResImage
我也尝试过使用以下 html 来 POST 到操作,同样的事情发生了:
<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/