0

Только что начал использовать ASP.Net 4.5, и мой API всегда возвращает ошибку внутреннего сервера.Внутренняя ошибка сервера 500 при async upload asp mvc 5

Загрузить API

public class UploadController : ApiController 
{ 
    public async Task<HttpResponseMessage> PostFile() 
    { 
     if (!Request.Content.IsMimeMultipartContent()) 
     { 
      throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 
     } 

     string root = HttpContext.Current.Server.MapPath("~/App_Data/uploads/"); 
     var provider = new CustomMultipartFormDataStreamProvider(root); 

     try 
     { 
      await Request.Content.ReadAsMultipartAsync(provider); 

      return Request.CreateResponse(HttpStatusCode.OK); 
     } 
     catch (System.Exception e) 
     { 
      return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e); 
     } 
    } 

}

Мой контроллер

var message = new HttpRequestMessage(); 
    var content = new MultipartFormDataContent(); 
    message.Method = HttpMethod.Post; 
    message.Content = content; 
    message.RequestUri = new Uri("http://localhost:12345/api/upload/"); 

    var client = new HttpClient(); 
    client.SendAsync(message).ContinueWith(task => 
    { 
      var result = task.Result.ReasonPhrase; 
      if (task.Result.IsSuccessStatusCode) 
      { 
        //do something 
      } 
    }); 

Файлы сохраняются в папке (/ App_Data/добавления /), но почему статус код всегда 500?

Пожалуйста, просветите меня. Благодаря

+0

[Здесь] (http://stackoverflow.com/questions/5193842/file-upload-asp-net-mvc-3-0) файлов загрузить пример. Можете ли вы рассказать больше, когда получите эту ошибку. –

+0

Ссылка является примером синхронной загрузки. Моя реализация асинхронна. – Awoi

+0

Один момент я отправлю асинхронный пример. –

ответ

0

Вот часть рабочего контроллера:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Create(Product product, HttpPostedFileBase file) 
    { 
     if (!ModelState.IsValid) 
      return PartialView("Create", product); 
     if (file != null) 
     { 

      var fileName = Path.GetFileName(file.FileName); 
      var guid = Guid.NewGuid().ToString(); 
      var path = Path.Combine(Server.MapPath("~/Content/Uploads/ProductImages"), guid + fileName); 
      file.SaveAs(path); 
      string fl = path.Substring(path.LastIndexOf("\\")); 
      string[] split = fl.Split('\\'); 
      string newpath = split[1]; 
      string imagepath = "Content/Uploads/ProductImages/" + newpath; 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       file.InputStream.CopyTo(ms); 
       byte[] array = ms.GetBuffer(); 
      } 
      var nId = Guid.NewGuid().ToString(); 
      // Save record to database 
      product.Id = nId; 
      product.State = 1; 
      product.ImagePath = imagepath; 
      product.CreatedAt = DateTime.Now; 
      db.Products.Add(product); 
      await db.SaveChangesAsync(); 
      TempData["message"] = "ProductCreated"; 

      //return RedirectToAction("Index", product); 
     } 
     // after successfully uploading redirect the user 
     return Json(new { success = true }); 
    } 
+0

ПРИМЕЧАНИЕ. У вас есть разрешения на изменение для вашей папки для загрузки: IIS_IUSRS –

+1

Я не думаю, что проблема связана с асинхронной частью реализации. Он успешно сохраняет файлы на сервере, но он всегда входит в блок catch. Я не знаю почему. – Awoi

+0

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