我正在开发 Silverlight 业务应用程序并希望实现“多部分”上传,它将单个文件拆分为大小为 4096KB 的部分。要将这些部分从客户端上传到服务器,我使用了 WebClient(客户端)和通用处理程序(*.ashx,服务器端)。
策略:第一部分创建了一个实体框架类的新实例。这个对象有一个字段/属性“二进制”(在 SQL 中它是一个 varbinary(MAX),在实体框架中它是一个字节 [])。我将第一部分存储在属性“二进制”中并执行 SaveChanges()。然后,处理程序将这个新对象的 ID(主键)返回给客户端。
在我的文件的第二部分旁边,对服务器的第二个请求包含第一个请求后返回的 ID。在服务器上,我从数据库加载先前创建的对象并附加第二部分。
myobject.binary = myobject.binary.Concat(bytes).ToArray<byte>();
myobject是先前创建的对象,字节是我要附加到二进制属性的部分。
我重复这个“策略”,直到整个文件上传到服务器。这适用于最大大小约为 78MB 的文件。对于大小约为 83MB 的文件,它的工作是零星的。大小约为 140MB 的文件将在 SaveChanges() 处中止并出现OutOfMemory 异常。
堆栈跟踪
at System.Object.MemberwiseClone()
at System.Array.Clone()
at System.Data.Common.CommandTrees.DbConstantExpression..ctor(TypeUsage resultType, Object value)
at System.Data.Mapping.Update.Internal.UpdateCompiler.GenerateValueExpression(EdmProperty property, PropagatorResult value)
at System.Data.Mapping.Update.Internal.UpdateCompiler.BuildSetClauses(DbExpressionBinding target, PropagatorResult row, PropagatorResult originalRow, TableChangeProcessor processor, Boolean insertMode, Dictionary`2& outputIdentifiers, DbExpression& returning, Boolean& rowMustBeTouched)
at System.Data.Mapping.Update.Internal.UpdateCompiler.BuildUpdateCommand(PropagatorResult oldRow, PropagatorResult newRow, TableChangeProcessor processor)
at System.Data.Mapping.Update.Internal.TableChangeProcessor.CompileCommands(ChangeNode changeNode, UpdateCompiler compiler)
at System.Data.Mapping.Update.Internal.UpdateTranslator.<ProduceDynamicCommands>d__0.MoveNext()
at System.Linq.Enumerable.<ConcatIterator>d__71`1.MoveNext()
at System.Data.Mapping.Update.Internal.UpdateCommandOrderer..ctor(IEnumerable`1 commands, UpdateTranslator translator)
at System.Data.Mapping.Update.Internal.UpdateTranslator.ProduceCommands()
at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
at System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache)
at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)
at MyObjectContext.SaveChanges(SaveOptions options) in PathToMyEntityModel.cs:Line 83.
at System.Data.Objects.ObjectContext.SaveChanges()
at MultipartUpload.ProcessRequest(HttpContext context) in PathToGenericHandler.ashx.cs:Line 73.
有谁知道,我的实现有什么问题?如果您需要更多信息或代码片段,请告诉我。
亲切的问候,克里斯