public static async Task <IMultipartCollection> ReadMultipartAsync(this HttpRequest request, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); request.EnableRewind(); var parts = new MultipartCollection(); using (cancellationToken.Register(request.HttpContext.Abort)) { var contentType = GetContentType(request); var boundary = GetBoundary(contentType); var multipartReader = new MultipartReader(boundary, request.Body); var section = await multipartReader.ReadNextSectionAsync(cancellationToken); while (section != null) { var headers = new HeaderDictionary(section.Headers); var contentDisposition = headers.GetContentDisposition(); await section.Body.DrainAsync(cancellationToken); var part = new Multipart(request.Body, section.BaseStreamOffset.Value, section.Body.Length) { Headers = headers }; parts.Add(part); section = await multipartReader.ReadNextSectionAsync(cancellationToken); } } request.Body.Seek(0, SeekOrigin.Begin); return(parts); }