web-dev-qa-db-ja.com

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'は、このリソースではサポートされていません。 'multipart/form-data'。 "、" exceptionType ":" System.Net.Http.UnsupportedMediaTypeException "、" stackTrace ":" at System.Net.Http.HttpContentExtensions.ReadAsAsync [T](HttpContent content、Type type、IEnumerable1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n at System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable 1フォーマッタ、IFormatterLogger formatterLogger、CancellationToken cancelToken)\ r\n at System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request、Type type、IEnumerable`1 formatters、IFormatterLogger formatterLogger、CancellationToken cancelToken) "}

質問する前に何度も検索しましたが、解決策は見つかりませんでした。助けてくれたThnaks。

編集:

注:「facility」パラメーターを削除し、ファイルをアップロードするためのメソッドのみにすると、完全に機能しますが、JSONとファイルを一緒に投稿したいと思います。

16
Hashem

私も同じ問題を抱えていました。 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());

その後、1つのモデルでobjecとファイルを一緒に投稿できます。

:Nugetパッケージでは、バージョン1.1.0が最後ではありません。それらはまだ更新されていません。手動で最新バージョンをインストールできる可能性があります。

3
Yerkon

「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拡張機能を呼び出すことができます。