2016-04-07 6 views
0

gelegentlich in Web API „Fehler MIME mehrteiliger Körper zu lesen“, einen Upload einer gzip-Datei von einem Telefon-App an den Webservice schlägt mit dem folgenden Fehler:Zufalls

Error reading MIME multipart body part. 

at System.Net.Http.HttpContentMultipartExtensions.<MultipartReadAsync>d__8.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at System.Net.Http.HttpContentMultipartExtensions.<ReadAsMultipartAsync>d__0`1.MoveNext() 

Der Endpunkt selbst ist ziemlich einfach:

[System.Web.Http.HttpPost] 
    public async Task<HttpResponseMessage> TechAppUploadPhoto() 
    { 
     if (!Request.Content.IsMimeMultipartContent()) 
     { 
      return Request.CreateErrorResponse(HttpStatusCode.UnsupportedMediaType, "The request isn't valid!"); 
     } 

     try 
     { 
      var provider = new MultipartMemoryStreamProvider(); 
      await Request.Content.ReadAsMultipartAsync(provider); 
      foreach (StreamContent file in provider.Contents) 
      { 
       Stream dataStream = await file.ReadAsStreamAsync(); 
       String fileName = file.Headers.ContentDisposition.FileName; 
       fileName = [unique name]; 

       String filePath = Path.Combine(ConfigurationManager.AppSettings["PhotoUploadLocation"], fileName); 

       using (var fileStream = File.Create(filePath)) 
       { 
        dataStream.Seek(0, SeekOrigin.Begin); 
        dataStream.CopyTo(fileStream); 
        fileStream.Close(); 
        dataStream.Close(); 
       } 

       // Enable overwriting with ZipArchive 
       using (ZipArchive archive = ZipFile.OpenRead(filePath)) 
       { 
        foreach (ZipArchiveEntry entry in archive.Entries) 
        { 
         entry.ExtractToFile(Path.Combine(ConfigurationManager.AppSettings["PhotoUploadLocation"], entry.FullName), true); 
        } 
       } 
       File.Delete(filePath); 
      } 

      return Request.CreateResponse(HttpStatusCode.Accepted); 
     } 
     catch (Exception e) 
     { 
      return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "PostCatchErr: " + e.Message + e.StackTrace); 
     } 
    } 

Dieser Fehler scheint ziemlich zufällig und schwer zu erstellen. Leider habe ich kein Ende geschrieben und habe hier nicht viel Erfahrung, aber es scheint auch nichts mit der Größe des Uploads zu tun zu haben - es ist ein großes Limit in der Webkonfiguration und größere Dateien können hochgeladen werden die diesen Fehler aus. Gibt es etwas, das ich vermisse, das dieses Problem verursachen könnte? Es scheint nur einmal die Körperinformationen zu lesen, was die andere mögliche Ursache ist, die ich gefunden habe. Irgendwelche Gedanken?

Antwort

0

This Antwort auf eine ähnliche Frage hat mir geholfen. Der Wert für maxRequestLength ist nicht korrekt. Es sollte 30000 für 30 MB sein (wie in einem der Kommentare auf die Antwort hingewiesen).