Web API文件上载问题

时间:2013-11-25 20:59:10

标签: asp.net-mvc-4 asp.net-web-api multipartform-data ninject.web.mvc

使用MVC 4我正在尝试构建一个Web API控制器,您可以在其中上传图像。上传完成后,控制器应将图像保存在数据库中。这是我的代码:

[HttpPost]
public void UploadPhoto(int thirdPartyID)
{            
    if (!Request.Content.IsMimeMultipartContent())
        throw new Exception(); // divided by zero

    byte[] data = null;
    var filename = string.Empty;

    var provider = new MultipartMemoryStreamProvider();
    Request.Content.ReadAsMultipartAsync(provider).ContinueWith(y =>
    {
        foreach (var file in provider.Contents)
        {
            filename = file.Headers.ContentDisposition.FileName.Trim('\"');
            data = file.ReadAsByteArrayAsync().Result;                            
        }

        var image = this.GetImageFrom(data);            
        var member = this.GetMemberBy(thirdPartyID);

        member.ProfileImage = data; 

        this.memberService.Save();                        
    });           
}

执行以下行时会出现问题:

this.memberService.Save();

我正在使用Ninject和Entity Framework。执行此操作时,我收到错误:ObjectContext实例已被释放,不能再用于需要连接的操作。我假设这种情况正在发生,因为'ContinueWith'在不同的请求范围内异步执行,而不是我的DI绑定原始DbContext?这是我的UOW的DI绑定:

kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InScope(x => HttpContext.Current);

我已经阅读了如何更改DI以使其范围绑定到一个对象,但这是一个大型项目,我在这个阶段改变组合根目标并不舒服。有没有人有一个不涉及改变DI的解决方案?我尝试更改行

Request.Content.ReadAsMultipartAsync(provider).ContinueWith(y =>...

同步运行
Request.Content.ReadAsMultipartAsync(provider).RunSynchronously();

Request.Content.ReadAsMultipartAsync(provider).Wait();

'RunSynchronously'方法给我一个错误,Wait()方法只是挂起。我只需要上传图像然后将其存储在数据库中。

EDIT 刚刚出现了这个问题:Request.Content.ReadAsMultipartAsync never returns。我根据该帖子更新了我的代码并解决了我的问题!

2 个答案:

答案 0 :(得分:3)

请看这3个链接。我希望他们能解决你的问题:

1.Henrik的博客:Asynchronous File Upload using ASP.NET Web API

2.示例代码:ASP.NET Web API: File Upload and Multipart MIME

3.Nice教程:A guide to asynchronous file uploads in ASP.NET Web API RTM

答案 1 :(得分:0)

我认为您可以查看有明确样本的Webapi formdata upload (to DB) with extra parameters

我尝试了它并且有效。