1

Хорошо, у меня есть ситуация, которая, похоже, не имеет смысла. У меня есть контроллер, таким образом:MVC3 - При использовании HttpPostedFileBase с большими файлами, RedirectToAction очень медленный

public ActionResult Index() 
{ 
    return View(_courseService.ListAllCourses()); 
} 


[HttpPost] 
public ActionResult CreateNewCourse(CourseVDO course, HttpPostedFileBase CourseDataFile) 
{ 
     return RedirectToAction("Index");  
} 

и вид таким образом:

@using (Html.BeginForm("CreateNewCourse", "Home", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    @Html.ValidationSummary(false) 
    <fieldset> 
     <legend>Course</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Name) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Name) 
      @Html.ValidationMessageFor(model => model.Name) 
     </div> 

     <div class="editor-label">   
      Course Data File 
     </div> 
     <div class="editor-field">       
      <input type="file" name="CourseDataFile" id="CourseDataFile" />    
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Visible) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Visible) 
      @Html.ValidationMessageFor(model => model.Visible) 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 

Когда я отправить файл из около 200KB, он загружает на сервер достаточно быстро (это местное в конце концов), но потом занимает 5 секунд, чтобы перейти от «return RedirectToAction (« Index »);« вернитесь к точке останова на «обратном представлении» (_courseService.ListAllCourses()); line (фактически не выполняет ListAllCourses). Это означает, что это полностью зависит от внутренней сантехники. Хуже того, эта задержка масштабируется с размером файла. Что происходит, и как я могу остановить его?

Благодаря

+0

Приостановите отладчик и посмотрите на стек вызовов, чтобы узнать, что он делает. – SLaks

+0

К сожалению, он НЕ отказался от своих секретов. Нет стека. Новый день и перезагрузка позже, и код работает так, как ожидалось. Хо Хум. – BenP

+0

Отсутствует трассировка стека? Это не имеет смысла. Вы отключили Just My Code? – SLaks

ответ

2

Я никогда не использовал этот метод прежде, и это не прямой ответ, но, возможно, его лучшее решение:

// used when editing an item 
public void UploadFiles(FormCollection form, NameValueCollection currentFiles, string folder, bool useTicks) 
    { 
     foreach (string file in Request.Files) 
     { 
      var hpf = Request.Files[file]; 

      if (hpf.ContentLength == 0) 
      { 
       form[file] = currentFiles[file]; 
      } 
      else 
      { 
       var filename = useTicks ? hpf.FileName 
        .Replace(" ", "_") 
        .Replace(".", RandomFileName() + ".") : hpf.FileName; 

       var myPath = Server.MapPath("~/Content/" + folder); 
       hpf.SaveAs(myPath + "/" + filename); 

       form[file] = filename; 
      } 
     } 

     if (Request.Files.Count > 0) return; 
     foreach (var file in currentFiles.AllKeys) 
     { 
      form[file] = currentFiles[file]; 
     } 
    } 

//used when creating a new item 
    public void UploadFiles(FormCollection form, string folder, bool useTicks) 
    { 

     foreach (string file in Request.Files) 
     { 
      var hpf = Request.Files[file]; 

      if (hpf.ContentLength == 0) 
      { 
       form[file] = null; 
      } 
      else 
      { 
       var filename = ""; 
       filename = useTicks ? 
        hpf.FileName.Replace(" ", "_").Replace(".", RandomFileName() + ".") : 
        hpf.FileName; 

       UploadFileName = filename; 
       var myPath = Server.MapPath("~/Content/" + folder); 
       hpf.SaveAs(myPath + "/" + filename); 

       form[file] = UploadFileName; 
      } 

     } 

    } 

Я использую модели так в моей модели элемента я использую UIHint ("UploadBox")

здесь код внутри просмотров/Shared/EditorTemplates/UploadField.cshtml

@Html.TextBox("",null,new{type="File"}) 

здесь является примером использования функции загрузки:

public ActionResult AddFiles(FormCollection form, SomeModel myModel) 
    { 
     UploadFiles(form,"products", true); 
     myModel.pdfFile = form["pdffile"]; 
     myModel.thumbnail = form["thumbnail"]; 

здесь кода при редактировании пункта, в случае, если файл не был изменен, но другие детали имеют

var existingFile = ctx2.modelname.SingleOrDefault(x => x.Id == id).Filename; 
     NameValueCollection myCol = new NameValueCollection(); 
     myCol.Add("Filename", existingFile); 
     UploadFiles(form, myCol, "uploads/custom", true); 

     myModel.Filename = form["Filename"]; 

просто a мысль :-)

+0

Сначала я искал модельный подход, но не смог найти пример. Моя первоначальная проблема загадочно исчезла в одночасье, поэтому я буду отмечать это как ответ, так как это отличный пример, чтобы заставить других начать. благодаря – BenP

Смежные вопросы