2014-12-19 43 views
15

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

,我想打电话给它,所以我送与小提琴手这个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“:”at System.Net.Http.HttpContentExtensions.ReadAsAsync [T](HttpContent content,Type IEnumerable 1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n at System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable 1格式化程序,IFormatterLogger formatterLogger,CancellationToken cancellationToken)\ r \ n在System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage请求,类型类型,IEnumerable`1格式化程序,IFormatterLogger formatterLogger,CancellationToken cancellationToken)“}

我询问了很多,但没有找到任何解决方案。 Thnaks帮助。

编辑:

的说明:如果我只上载的文件中删除“设施”参数,让方法,它的作品完美,但我想张贴JSON和文件一起。

+0

你好,你有解决这个问题的办法吗?我有同样的问题。 – uikrosoft 2015-03-13 09:18:26

+0

@uikrosoft,不要在api函数中设置参数(参数)(不带参数)。并从帖子主体获取你的参数值。这对我有效。 – Hashem 2015-03-16 08:05:27

+0

这里是一个完整的教程:http://www.asp.net/web-api/overview/advanced/sending-html-form-data,-part-2 – 2015-06-17 08:09:54

回答

3

“mulitpart /表单数据”,所以我们注册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扩展。

+0

但是这样,我无法获得上传文件,该帖子不再是多部分了!我说的对吗? – Hashem 2014-12-19 09:18:40

+0

你是对的。你能否请检查这篇文章。我已编辑我的回答 – 2014-12-19 09:39:38

+5

不幸的是,它没有工作,但我强制实施CanReadType和CanWriteType方法,我返回true。当我打电话给api时,我得到的回应是500,没有内容! :( – Hashem 2014-12-19 09:58:19

1

我有同样的问题。对于ASP.NET WebApi,由MultipartDataMediaFormatter解决。使用方法:

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

+2

欢迎您访问解决方案的链接,但请确保您的答案在没有它的情况下很有用:[添加链接的上下文](// meta.stackexchange.com/a/8259),以便您的同行用户了解什么它是,为什么它在那里,然后引用你链接到的页面中最相关的部分,以防目标页面不可用[只有链接的答案可能会被删除。](// stackoverflow.com/帮助/删除-答案) – 2017-05-12 11:00:13

相关问题