C# 将表单数据和文件发布到ASP.NET Web API
我有这个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.
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内容,类型,IEnumerable1格式化程序,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的解决者。如何使用:
- 如果WebApi托管在IIS上(应用程序启动时):
GlobalConfiguration.Configuration.Formatters.Add(新表单MultipartncodedMediaTypeFormatter());
- 如果WebApi是自托管的:
new-HttpSelfHostConfiguration().Formatters.Add(new-formMultipartncodedMediaTypeFormatter());
注意:在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());