c# - ASP.NET Core EF - 上传文件时出错

标签 c# mysql entity-framework asp.net-core

我正在使用 ASP.NET Core、EF Core 开发一个系统,我的数据库是 MySQL,我正在使用 MySQL Connector.NET 作为适配器。

我的系统中有一个位置,用户可以在其中选择文件并上传。我的问题是,当我尝试上传超过 1000 KB 的文件时,出现以下错误:

An established connection was aborted by the software in your host machine

此文件的数据库字段是 LONGBLOB 类型,模态类型是 byte[]。错误直接在 dbcontext.SaveChanges() 方法中抛出,这就是为什么很难调试和找出原因的原因。

我将在下面发布完整的堆栈跟踪:

   at MySqlConnector.Protocol.Serialization.SocketByteHandler.WriteBytesAsync(ArraySegment`1 data, IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\Protocol\Serialization\SocketByteHandler.cs:line 90
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at MySqlConnector.Utilities.ValueTaskExtensions.<ContinueWith>d__0`2.MoveNext() in C:\projects\mysqlconnector\src\MySqlConnector\Utilities\ValueTaskExtensions.cs:line 8
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at MySqlConnector.Core.ServerSession.TryAsyncContinuation(Task`1 task) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ServerSession.cs:line 1225
   at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot)
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at MySqlConnector.Core.TextCommandExecutor.<ExecuteReaderAsync>d__1.MoveNext() in C:\projects\mysqlconnector\src\MySqlConnector\Core\TextCommandExecutor.cs:line 36
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at MySql.Data.MySqlClient.MySqlCommand.<ExecuteNonQueryAsync>d__60.MoveNext() in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlCommand.cs:line 261
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery() in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlCommand.cs:line 62
   at MySql.Data.MySqlClient.MySqlTransaction.Dispose(Boolean disposing) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlTransaction.cs:line 81
   at Microsoft.EntityFrameworkCore.Storage.RelationalTransaction.Dispose()
   at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(DbContext _, ValueTuple`2 parameters)
   at Pomelo.EntityFrameworkCore.MySql.Storage.Internal.MySqlExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
   at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(IEnumerable`1 commandBatches, IRelationalConnection connection)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(IReadOnlyList`1 entriesToSave)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(Boolean acceptAllChangesOnSuccess)
   at Microsoft.EntityFrameworkCore.DbContext.SaveChanges(Boolean acceptAllChangesOnSuccess)
   at Zoneberry.Repository.ZONContext.SaveChanges() in path\ZONContext.cs:line 157
   at path.Commit() in project\UnitOfWork.cs:line 419
   at project.Controller.UploadFileFor(List`1 files, Int32 leadId, Int32 totalCount) in project\Controllers\LeadController.cs:line 220
   at lambda_method(Closure , Object , Object[] )
   at Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeActionMethodAsync>d__12.MoveNext()

当我上传小于 1MB 的文件时,系统工作正常。

最佳答案

可能您在 MySql 方面有限制。尝试在 MySql 服务器上执行此命令:

SHOW VARIABLES LIKE 'max_allowed_packet';

如果结果接近 100 万 字节,那么您需要通过运行以下命令来增加该值(例如将近 2 MB):

SET GLOBAL max_allowed_packet=2000000;

但此设置将在服务器重启后重置。 要永久更改设置,您需要在 [mysqld] 部分下的 my.ini~/.my.cnf 中更改它:

max_allowed_packet=2M 

关于c# - ASP.NET Core EF - 上传文件时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54533598/

相关文章:

c# - 我应该在哪里放置 MEF 的接口(interface)?

php - 使用 REGEXP 在 MySQL 中搜索

c# - EF 4.3 和 POCO 类 - 在哪里拦截属性值?

c# - Entity Framework 代码优先 : Custom Mapping

c# - 连接中的 Entity Framework 子查询

c# - Json.NET 根据属性类型使属性成为必需的

javascript - C# mv5 通过链接传递参数然后在 View 中获取它

c# - 未将对象引用设置为对象实例 由 DBNull.Value 引起

php - 在输入字段中存储 JSON 值

mysql - 如何在django中删除具有重复列的行