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

Has*_*hem 15 .net c# asp.net asp.net-mvc asp.net-web-api

我有这个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));
    }
Run Code Online (Sandbox Code Playgroud)

我想打电话给它,所以我用fiddler发送这个http请求:

标题:

Content-Type: multipart/form-data; boundary=-------------------------acebdf13572468
User-Agent: Fiddler
Host: localhost:44301
Content-Length: 3279
Run Code Online (Sandbox Code Playgroud)

身体:

---------------------------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--
Run Code Online (Sandbox Code Playgroud)

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

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

在询问之前我搜索了很多,但找不到任何解决方案.向你求助.

编辑:

注意:如果我删除"facility"参数,并让该方法仅用于上传文件,它的工作完美,但我想将JSON和文件一起发布.

Yer*_*kon 6

我有同样的问题。由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 版不是最后一个。他们还没有更新。也许可以手动安装最新版本。

  • 欢迎提供解决方案的链接,但请确保您的答案在没有它的情况下也有用:[在链接周围添加上下文](//meta.stackexchange.com/a/8259) 这样您的其他用户就会知道它是什么以及为什么它在那里,然后引用您链接到的页面中最相关的部分,以防目标页面不可用。[仅是链接的答案可能会被删除。](//stackoverflow.com/help/deleted-answers) (2认同)

Jay*_*thy 3

“multipart/form-data”所以我们注册UploadMultipartMediaTypeFormatter

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

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

config.Formatters.Add(new UploadMultipartMediaTypeFormatter());
Run Code Online (Sandbox Code Playgroud)

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

  • 不幸的是它不起作用,但我强制实现 CanReadType 和 CanWriteType 方法,并且返回 true。当我调用 api 时,我得到响应 500 并且没有内容!:( (6认同)