[英]Posting form-data AND a file to 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));
}
我想打電話給它,所以我用fiddler發送這個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內容,類型類型,IEnumerable
1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\\r\\n at System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable
程序,IFormatterLogger formatterLogger,CancellationToken cancellationToken)\\ r \\ n在System.Web.Http1 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 .ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage請求,類型類型,IEnumerable`1格式化程序,IFormatterLogger formatterLogger,CancellationToken cancellationToken)“}
在詢問之前我搜索了很多,但找不到任何解決方案。 向你求助。
編輯:
注意:如果我刪除“facility”參數,並讓該方法僅用於上傳文件,它的工作完美,但我想將JSON和文件一起發布。
“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擴展。
我有同樣的問題。 由ASP.NET WebApi的MultipartDataMediaFormatter解決。 如何使用:
將當前格式化程序添加到WebApi格式化程序集合:
GlobalConfiguration.Configuration.Formatters.Add(new FormMultipartEncodedMediaTypeFormatter());
如果WebApi是自托管的:
new HttpSelfHostConfiguration(<url>).Formatters.Add(new FormMultipartEncodedMediaTypeFormatter());
之后,您可以在一個模型中將objec與文件一起發布。
注意 :在Nuget包中,版本1.1.0不是最后一個。 它們尚未更新。 也許可以手動安裝最新版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.