Silverlight ビジネス アプリケーションを開発していて、1 つのファイルを 4096 KB のサイズのパーツに分割する「マルチパート」アップロードを実装したいと考えています。これらのパーツをクライアントからサーバーにアップロードするために、WebClient (クライアント側) と汎用ハンドラー (*.ashx、サーバー側) を使用しています。
戦略: 最初の部分で、Entity Framework クラスの新しいインスタンスが作成されます。このオブジェクトには、フィールド/プロパティ「バイナリ」があります (SQL では varbinary(MAX)、Entity Framework では byte[])。最初の部分を「binary」プロパティに保存し、SaveChanges() を実行します。次に、ハンドラーは、この新しいオブジェクトの ID (主キー) をクライアントに返します。
サーバーへの 2 番目の要求には、ファイルの 2 番目の部分のほかに、最初の要求の後に返された ID が含まれています。サーバー上で、以前に作成したオブジェクトをデータベースから読み込み、2 番目の部分を追加します。
myobject.binary = myobject.binary.Concat(bytes).ToArray<byte>();
myobjectは以前に作成したオブジェクトで、バイトはバイナリプロパティに追加する部分です。
ファイル全体がサーバーにアップロードされるまで、この「戦略」を繰り返します。これは、最大サイズが 78 MB までのファイルで問題なく機能します。サイズが ~83MB のファイルの場合、散発的に動作します。サイズが ~140MB のファイルは、SaveChanges() でOutOfMemory Exceptionで中止されます。
スタックトレース
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.
私の実装の何が問題なのですか?さらに詳しい情報やコード スニペットが必要な場合は、お知らせください。
敬具、クリス