使用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。我根据该帖子更新了我的代码并解决了我的问题!
答案 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。
我尝试了它并且有效。