コード例 #1
0
        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);
        }