c# - Request.Content.ReadAsMultipartAsync 从不返回

标签 c# asp.net-web-api c#-5.0

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

相关文章:

c# - Owin WebApi 服务忽略 ExceptionFilter

c# - 为什么 MVC 4 在等待操作时处理 Controller ?

c# - 在 Async/Await 中调试异常(调用堆栈)

c# - 结构图 ObjectFactory.GetAllInstances<IHandle<TEvent>>()

c# - MVVM访问整个 View 的实践

azure - 使用 WebApi 保护 Azure 存储中的文件访问

c# - 使用基本身份验证将 cookie 添加到 Katana 托管的 WebAPI

asp.net-mvc - Azure 身份验证与 OAuth 身份验证结合使用

c# - 如何让 Linqpad intellisense 显示 C# 5.0 方法?

c# - 使用C#方法组执行代码