【问题标题】:Posting form-data AND a file to ASP.NET Web API将表单数据和文件发布到 ASP.NET Web API
【发布时间】:2015-02-18 04:05:57
【问题描述】:

我有这个 ASP.NET Web API 方法,我想发布一个对象,同时发布一个文件!

    public async Task<IHttpActionResult> Post(Facility facility)
    {
        if (!ModelState.IsValid)
            return BadRequest();

        // Check if the request contains multipart/form-data.
        if (!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }

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

            // Read the form data.
            await Request.Content.ReadAsMultipartAsync(provider);

            // This illustrates how to get the file names.
            foreach (MultipartFileData file in provider.FileData)
            {
                Trace.WriteLine(file.Headers.ContentDisposition.FileName);
                Trace.WriteLine("Server file path: " + file.LocalFileName);
            }
            // Logic
            // Login

        return Ok(facilityManager.Insert(facility));
    }

我想调用它,所以我用 fiddler 发送这个 http 请求:

标题:

Content-Type: multipart/form-data; boundary=-------------------------acebdf13572468
User-Agent: Fiddler
Host: localhost:44301
Content-Length: 3279

主体:

---------------------------acebdf13572468
Content-Disposition: form-data; name="fieldNameHere"; filename="credits.txt"
Content-Type: text/plain

<@INCLUDE *C:\Program Files (x86)\Fiddler2\credits.txt*@>
---------------------------acebdf13572468
Content-Disposition: form-data; name="facility"
Content-Type: application/json
{
    "FacilityTypeId":"1"
}
---------------------------acebdf13572468--

我收到带有响应文本的 415 错误代码:

{"message":"该资源不支持请求实体的媒体类型 'multipart/form-data'。","exceptionMessage":"没有 MediaTypeFormatter 可用于从内容中读取类型为 'Facility' 的对象媒体类型为 'multipart/form-data'。","exceptionType":"System.Net.Http.UnsupportedMediaTypeException","stackTrace":" 在 System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent 内容,类型类型,IEnumerable1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n at System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable1 格式化程序,IFormatterLogger formatterLogger,CancellationToken cancelToken)\r\n 在 System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage 请求,类型类型,IEnumerable`1 格式化程序,IFormatterLogger formatterLogger,CancellationToken cancelToken)" }

在询问之前我进行了很多搜索,但找不到任何解决方案。感谢您的帮助。

编辑:

注意:如果我删除“facility”参数,并让该方法仅用于上传文件,则效果很好,但我想将 JSON 和文件一起发布。

【问题讨论】:

  • 您好,请问您有解决这个问题的办法吗?我也有同样的问题。
  • @uikrosoft,不要在 api 函数中设置参数(参数)(使其不带参数)。并从帖子正文中获取该函数内的参数值。这对我有用。
  • 这里有一个完整的教程:asp.net/web-api/overview/advanced/…

标签: c# asp.net .net asp.net-mvc asp.net-web-api


【解决方案1】:

"mulipart/form-data" 所以我们注册了 UploadMultipartMediaTypeFormatter

public class UploadMultipartMediaTypeFormatter : MediaTypeFormatter
{
    UploadMultipartMediaTypeFormatter()
    {
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("multipart/form-data"));
    }
}

* 在 global.asax 中注册或(参见沙箱代码)

config.Formatters.Add(new UploadMultipartMediaTypeFormatter());

WebApi 现在将调用 MediaTypeFormatter.ReadFromStreamAsync,我们可以从那里调用 HttpContent.ReadAsMultipartAsync 扩展。

【讨论】:

  • 但是这样一来,我就无法获取上传的文件,帖子不再是多部分了!我说的对吗?
  • 你是对的。你能检查一下这篇文章吗?我已经编辑了我的答案
  • 不幸的是它没有工作,但我强制实现 CanReadType 和 CanWriteType 方法,我返回了 true。当我调用 api 时,我得到响应 500 并且没有内容! :(
【解决方案2】:

我遇到了同样的问题。由MultipartDataMediaFormatter 为 ASP.NET WebApi 解决。使用方法:

  1. 从 Nuget 包中查找并安装 MultipartDataMediaFormatter
  2. 将当前格式化程序添加到 WebApi 格式化程序集合:

    • 如果 WebApi 托管在 IIS 上(在应用程序启动上)。 :
      • GlobalConfiguration.Configuration.Formatters.Add(new FormMultipartEncodedMediaTypeFormatter());
    • 如果 WebApi 是自托管的:

      • new HttpSelfHostConfiguration(&lt;url&gt;).Formatters.Add(new FormMultipartEncodedMediaTypeFormatter());

之后,您可以将对象与文件一起发布到一个模型中。

注意:在 Nuget 包中,版本 1.1.0 不是最后一个。他们还没有更新。也许可以手动安装最新版本。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 2014-01-27
  • 1970-01-01
  • 2017-01-16
  • 2020-04-16
  • 2014-01-08
  • 1970-01-01
相关资源
最近更新 更多