Загрузка большого файла в MVC обнаружена ошибка

У меня есть файл.txt размером до 2 ГБ, я хочу загрузить этот файл с клиента в папку на сервере, при загрузке этого файла возникает ошибка, это то, что говорит страница:

An operation was attempted on a nonexistent network connection. (Exception from HRESULT: 0x800704CD) 
  Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

 Exception Details: System.Runtime.InteropServices.COMException: An operation was attempted on a nonexistent network connection. (Exception from HRESULT: 0x800704CD)

Source Error: 


 An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.  

Stack Trace: 



[COMException (0x800704cd): An operation was attempted on a nonexistent network connection. (Exception from HRESULT: 0x800704CD)]

[HttpException (0x80004005): An error occurred while communicating with the remote host. The error code is 0x800704CD.]
   System.Web.Hosting.IIS7WorkerRequest.RaiseCommunicationError(Int32 result, Boolean throwOnDisconnect) +3399867
   System.Web.Hosting.IIS7WorkerRequest.ReadEntityCoreSync(Byte[] buffer, Int32 offset, Int32 size) +9621484
   System.Web.Hosting.IIS7WorkerRequest.ReadEntityBody(Byte[] buffer, Int32 size) +24
   System.Web.HttpRequest.GetEntireRawContent() +315
   System.Web.HttpRequest.GetMultipartContent() +63
   System.Web.HttpRequest.FillInFormCollection() +160
   System.Web.HttpRequest.EnsureForm() +69
   System.Web.HttpRequest.get_Form() +13
   System.Web.HttpRequestWrapper.get_Form() +14
   System.Web.Mvc.HttpRequestExtensions.GetHttpMethodOverride(HttpRequestBase request) +121
   System.Web.Mvc.AcceptVerbsAttribute.IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo) +37
   System.Web.Mvc.HttpGetAttribute.IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo) +39
   System.Web.Mvc.ActionMethodSelectorBase.IsValidMethodSelector(ReadOnlyCollection`1 attributes, ControllerContext controllerContext, MethodInfo method) +54
   System.Web.Mvc.ActionMethodSelectorBase.RunSelectionFilters(ControllerContext controllerContext, List`1 methodInfos) +132
   System.Web.Mvc.ActionMethodSelectorBase.FindActionMethods(ControllerContext controllerContext, String actionName) +142
   System.Web.Mvc.ActionMethodSelectorBase.FindActionMethod(ControllerContext controllerContext, String actionName) +104
   System.Web.Mvc.Async.ReflectedAsyncControllerDescriptor.FindAction(ControllerContext controllerContext, String actionName) +54
   System.Web.Mvc.ControllerActionInvoker.FindAction(ControllerContext controllerContext, ControllerDescriptor controllerDescriptor, String actionName) +16
   System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext controllerContext, String actionName, AsyncCallback callback, Object state) +114
   System.Web.Mvc.Controller.<BeginExecuteCore>b__1c(AsyncCallback asyncCallback, Object asyncState, ExecuteCoreState innerState) +25
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallBeginDelegate(AsyncCallback callback, Object callbackState) +30
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +128
   System.Web.Mvc.Controller.BeginExecuteCore(AsyncCallback callback, Object state) +468
   System.Web.Mvc.Controller.<BeginExecute>b__14(AsyncCallback asyncCallback, Object callbackState, Controller controller) +18
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallBeginDelegate(AsyncCallback callback, Object callbackState) +20
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +128
   System.Web.Mvc.Controller.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +374
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +16
   System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__3(AsyncCallback asyncCallback, Object asyncState, ProcessRequestState innerState) +52
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallBeginDelegate(AsyncCallback callback, Object callbackState) +30
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +128
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +384
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +48
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +103
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

И это часть кода:

    public ActionResult UploadFile_Post(FormCollection dt, string btn, HttpPostedFileBase uploadFile, FileUpload dataFile)
    {
      string nameFile, getExtension = "";
      nameFile = System.IO.Path.GetFileNameWithoutExtension(uploadFile.FileName.ToString().Trim()) + "_" + usernm.Trim() + "_" + DateTime.Now.ToString("yyyyMMdd_HHmmss").Trim();
      getExtension = System.IO.Path.GetExtension(uploadFile.FileName.ToString().Trim());

      string FilePath = Server.MapPath("~\\Upload\\" + nameFile + ".txt");
      string pathFile = Server.MapPath("~\\Upload\\");

      if (System.IO.File.Exists(FilePath))
      {
           System.IO.File.Delete(FilePath);                            
      }
      uploadFile.SaveAs(FilePath);//i think failed at this process
   }

В файле Web.config я уже установил конфигурацию для maxRequestLength, executionTimeout, а также maxAllowedContentLength, Может быть, мой код неправильный, вы, ребята, можете дать мне лучший способ загрузить такой файл? Спасибо, извините за мой плохой английский.

2 ответа

<system.web>
    <httpRuntime executionTimeout="3600" maxRequestLength="102400" 
     appRequestQueueLimit="100" requestLengthDiskThreshold="10024000"/>
</system.web>

executeTimeout: указывает максимальное количество секунд, в течение которых запросу разрешено выполнять до автоматического закрытия ASP.NET.

maxRequestLength: задает предел порога буферизации входного потока в килобайтах.

appRequestQueueLimit: указывает максимальное количество запросов, которые ASP.NET ставит в очередь для приложения.

requestLengthDiskThreshold: задает предел порога буферизации входного потока в байтах. Это значение не должно превышать атрибут maxRequestLength.

Измените эти настройки и посмотрите, что произойдет. Также было бы неплохо узнать версию IIS, которую вы используете. https://msdn.microsoft.com/en-us/library/e1f13641%28v=vs.100%29.aspx

Вы никогда не должны разрешать загрузку файла такого большого размера на веб-сервер, поскольку он займет всю память и приведет к краху вашего веб-сервера. Помните, что при загрузке файла на веб-сервер все эти данные сохраняются в памяти при попытке записи в вашу базу данных или файловую систему. Для файлов такого размера вам необходимо загрузить файл через потоковую передачу файлов или через FTP. Если вы гуглите Джона Галлоуэя, он может дать вам ответы на другие вопросы о загрузке больших файлов.

Другие вопросы по тегам