我有一个使用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/