【问题标题】:HttpContent does not contain a definition for ReadAsMultipartAsyncHttpContent 不包含 ReadAsMultipartAsync 的定义
【发布时间】:2015-09-17 14:12:28
【问题描述】:

我正在使用 VS2015 创建一个 WebApi 项目。具体来说,我正在尝试编写一个简单的 Web 服务来使用 POST 上传文件。

我在使用以前版本的 Visual Studio 之前已经这样做了,但是 VS2015 使用了 ASP.NET 5 和 MVC 6,这显然有一些重大的 api 更改。

以前,我可以使用这样的东西:

Request.Content.ReadAsMultipartAsync().Result.Contents

顺便说一句,这是我搜索到的每个网站都推荐的。但是我的 VS2015 副本给了我以下编译时错误消息:

'HttpContent 不包含 ReadAsMultipartAsync 的定义'

WebApi 的整体项目结构似乎在 VS2015 中进行了改进。在这一点上,我不知道出了什么问题(无论是代码问题还是 VS2015 问题)。在过去的几天里,我一直在试图解决这个问题。谁能提供有关我做错了什么的见解?

下面是我的控制器的全部内容:

    [Route("api/[controller]")]
public class UploadController : Controller
{
    private readonly IApplicationEnvironment appEnvironment;

    public UploadController(IApplicationEnvironment appEnvironment)
    {
        this.appEnvironment = appEnvironment;
    }

    // POST api/values
    [HttpPost]
    public void Post(HttpRequestMessage request)
    {
        string logFolder = "logs";
        string fileName = "uploader.log";
        string logFile = Path.Combine(this.appEnvironment.ApplicationBasePath, logFolder, fileName);
        string directory = Path.GetDirectoryName(logFile);

        if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory))
        {
            Directory.CreateDirectory(directory);
        }

        using (Stream requestStream = GetStreamFromUploadedFile(request))
        {
            using (Stream fileStream = System.IO.File.Create(logFile))
            {
                try
                {
                    requestStream.CopyTo(fileStream);
                }
                finally
                {
                    // No longer supported?
                    //fileStream.Close();
                    //requestStream.Close();
                }
            }
        }

    }

    private static Stream GetStreamFromUploadedFile(HttpRequestMessage request)
    {
        IEnumerable<HttpContent> parts = null;
        Task.Factory
            .StartNew(() => parts = request.Content.ReadAsMultipartAsync().Result.Contents,
                            CancellationToken.None,
                            TaskCreationOptions.LongRunning,
                            TaskScheduler.Default)
            .Wait();

        Stream stream = null;
        Task.Factory
            .StartNew(() => stream = parts.First().ReadAsStreamAsync().Result,
                            CancellationToken.None,
                            TaskCreationOptions.LongRunning,
                            TaskScheduler.Default)
            .Wait();
        return stream;
    }
}

【问题讨论】:

  • ASP.NET 5 仍处于测试阶段。记住这一点,很多东西都被转移了。如果您对此不满意,您可能还不想使用 ASP.NET 5。简单地用谷歌搜索可能会为旧版本的 ASP.NET 找到建议,除非您知道在哪里查找,否则不会那么有用。由于 ASP.NET 5 是在 GitHub 上公开开发的,欢迎您查看那里的source
  • 希望我从一开始就知道这一点。 感谢您的回复。

标签: asp.net-mvc asp.net-web-api visual-studio-2015 asp.net-core-mvc


【解决方案1】:

以下是如何在 ASP.NET 5/MVC 6 中进行文件上传的示例: https://github.com/aspnet/Mvc/blob/dev/test/WebSites/ModelBindingWebSite/Controllers/FileUploadController.cs#L16

using System.Collections.Generic;
using System.IO;
using System.Linq;
using Microsoft.AspNet.Mvc;
using Microsoft.AspNet.Http;
using Microsoft.Net.Http.Headers;
using ModelBindingWebSite.Models;

namespace ModelBindingWebSite.Controllers
{
    public class FileUploadController : Controller
    {
        public FileDetails UploadSingle(IFormFile file)
        {
            FileDetails fileDetails;
            using (var reader = new StreamReader(file.OpenReadStream()))
            {
                var fileContent = reader.ReadToEnd();
                var parsedContentDisposition = ContentDispositionHeaderValue.Parse(file.ContentDisposition);
                fileDetails = new FileDetails
                {
                    Filename = parsedContentDisposition.FileName,
                    Content = fileContent
                };
            }

            return fileDetails;
        }

        public FileDetails[] UploadMultiple(IEnumerable<IFormFile> files)
        {
            var fileDetailsList = new List<FileDetails>();
            foreach (var file in files)
            {
                var parsedContentDisposition = ContentDispositionHeaderValue.Parse(file.ContentDisposition);
                using (var reader = new StreamReader(file.OpenReadStream()))
                {
                    var fileContent = reader.ReadToEnd();
                    var fileDetails = new FileDetails
                    {
                        Filename = parsedContentDisposition.FileName,
                        Content = fileContent
                    };
                    fileDetailsList.Add(fileDetails);
                }
            }

            return fileDetailsList.ToArray();
        }

        public IDictionary<string, IList<FileDetails>> UploadMultipleList(IEnumerable<IFormFile> filelist1,
                                                                     IEnumerable<IFormFile> filelist2)
        {
            var fileDetailsDict = new Dictionary<string, IList<FileDetails>>
            {
                { "filelist1", new List<FileDetails>() },
                { "filelist2", new List<FileDetails>() }
            };
            var fileDetailsList = new List<FileDetails>();
            foreach (var file in filelist1.Concat(filelist2))
            {
                var parsedContentDisposition = ContentDispositionHeaderValue.Parse(file.ContentDisposition);
                using (var reader = new StreamReader(file.OpenReadStream()))
                {
                    var fileContent = reader.ReadToEnd();
                    var fileDetails = new FileDetails
                    {
                        Filename = parsedContentDisposition.FileName,
                        Content = fileContent
                    };
                    fileDetailsDict[parsedContentDisposition.Name].Add(fileDetails);
                }
            }

            return fileDetailsDict;
        }

        public KeyValuePair<string, FileDetails> UploadModelWithFile(Book book)
        {
           var file = book.File;
            var reader = new StreamReader(file.OpenReadStream());
            var fileContent = reader.ReadToEnd();
            var parsedContentDisposition = ContentDispositionHeaderValue.Parse(file.ContentDisposition);
            var fileDetails = new FileDetails
            {
                Filename = parsedContentDisposition.FileName,
                Content = fileContent
            };

            return new KeyValuePair<string, FileDetails>(book.Name, fileDetails);
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多