将表单数据和文件发布到 ASP.NET Web API

本文关键字:ASP NET Web API 文件发布 表单 数据 | 更新日期: 2023-09-27 18:34:44

我有这个 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));
    }

我想调用它,所以我用小提琴手发送这个 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 可用于从媒体类型为"multipart/form-data"的内容中读取类型为"Facility"的对象。","exceptionType":"System.Net.Http.UnsupportedMediaTypeException","stackTrace":" at System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent content, Type type, IEnumerable 1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)'r'n at System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable 1 格式化程序, IFormatterLogger formatterLogger, CancelToken cancelToken(''r' at System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable'1 formatters, IFormatterLogger formatterLogger, CancelToken cancelToken("}

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

编辑:

注意:如果我删除"facility"参数,并让该方法仅用于上传文件,它工作得很好,但我想一起发布 JSON 和一个文件。

将表单数据和文件发布到 ASP.NET Web API

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

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

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

      • new HttpSelfHostConfiguration(<url>).Formatters.Add(new FormMultipartEncodedMediaTypeFormatter());

之后,您可以在一个模型中将带有文件的 objec 一起发布。

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

"mulitpart/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扩展。