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

C# 将表单数据和文件发布到ASP.NET Web API,c#,asp.net,.net,asp.net-mvc,asp.net-web-api,C#,Asp.net,.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.

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

------------------------------------acebdf13572468
内容配置:表单数据;name=“fieldNameHere”;filename=“credits.txt”
内容类型:文本/纯文本
---------------------------acebdf13572468
内容配置:表单数据;name=“设施”
内容类型:application/json
{
“FacilityTypeId”:“1”
}
---------------------------acebdf13572468--
我得到一个带有响应文本的415错误代码:

{“message”:“此资源不支持请求实体的媒体类型‘multipart/form data’”,“exceptionMessage”:“没有MediaTypeFormatter可用于从媒体类型为‘multipart/form data’的内容中读取‘Facility’类型的对象。”,“exceptionType”:“System.Net.Http.UnsupportedMediaTypeException”,“stackTrace”::“位于System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent内容,类型,IEnumerable
1格式化程序,IFormatterLogger格式化程序记录器,CancellationToken CancellationToken)\r\n位于System.Net.Http.HttpContentExtensions.Readasync(位于System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync的HttpRequestMessage请求,类型,IEnumerable
1格式化程序,IFormatterLogger格式化程序记录器,CancellationToken CancellationToken)\r\n“}

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

编辑:

注意:如果我删除“facility”参数,让该方法只用于上载文件,它工作得很好,但我想将JSON和文件一起发布。

“mulitpart/form data”因此我们注册了UploadMultipartMediaTypeFormatter

public class UploadMultipartMediaTypeFormatter : MediaTypeFormatter
{
    UploadMultipartMediaTypeFormatter()
    {
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("multipart/form-data"));
    }
}
*在global.asax或中注册(请参阅沙盒代码)


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

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

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

    • 如果WebApi托管在IIS上(应用程序启动时):
      • GlobalConfiguration.Configuration.Formatters.Add(新表单MultipartncodedMediaTypeFormatter());
    • 如果WebApi是自托管的:

      • new-HttpSelfHostConfiguration().Formatters.Add(new-formMultipartncodedMediaTypeFormatter());
  • 之后,您可以将objec与文件一起发布到一个模型中


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

    但是这样,我无法获得上传的文件,帖子不再是多部分的!我说的对吗?你说的对。你能检查一下这篇文章吗。我编辑了我的回答,很遗憾,它不起作用,b但我强制实现CanReadType和CanWriteType方法,并返回true。当我调用api时,我得到响应500,但没有内容!:(您好,您有解决此问题的方法吗?我也有同样的问题。@uikrosoft,不要在api函数中设置参数(使其不带参数)。并从帖子正文中获取该函数中的参数值。这对我很有用。这里有一个完整的教程:欢迎链接到解决方案,但请确保您的答案在没有它的情况下是有用的:这样您的其他用户就会知道它是什么以及它为什么在那里,然后引用您链接到的页面中最相关的部分如果目标页不可用。
    ---------------------------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--
    
    public class UploadMultipartMediaTypeFormatter : MediaTypeFormatter
    {
        UploadMultipartMediaTypeFormatter()
        {
            SupportedMediaTypes.Add(new MediaTypeHeaderValue("multipart/form-data"));
        }
    }
    
    config.Formatters.Add(new UploadMultipartMediaTypeFormatter());