簡體   English   中英

將表單數據和文件發布到ASP.NET Web API

[英]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.Http 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 .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解決。 如何使用:

  1. 從Nuget包中找到並安裝MultipartDataMediaFormatter
  2. 將當前格式化程序添加到WebApi格式化程序集合:

    • 如果WebApi托管在IIS上(在Application Start上)。
      • 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM